Database 版 (精华区)
发信人: pine.bbs@sun20.nuaa.edu.cn (杆杆), 信区: cndatabase
标 题: [转载] 使用PowerBuilder另外500个函数(下)
发信站: nuaabbs (Fri Apr 17 23:58:07 1998)
转信站: Lilac!ustcnews!nuaabbs
【 以下文字转载自 Program 讨论区 】
【 原文由 pipishi.bbs@bbs.nju.edu.cn 所发表 】
激活另一个应用实现
首先声明下列local external函数
Subroutine BringWindowToTop(int hWnd) Library "User"
Function uint GetNextWindow(uint hWnd, int Flag) Li
brary "user"
Function uint GetWindowText(uint hWnd, REF string Ti
tle, uint Size ) Lib rary "user"
Function uint ShowWindow(uint hWnd, int CmdShow)
Library "user"
Function integer IsIconic(uint hWnd) Library "user
"
Function integer OPenIcon(uint hWnd) Library "user
"
Function integer FindWindow(string ClassName, stri
ng WindowName) Li brary "user"
Function integer FindWindow(long ClassName, strin
g WindowN ame) Library "user"
Function integer FindWindow(string ClassName, long
WindowName) Library "user"
键入下面的窗口级函数:
fw_make_app_active
//返回:boolean
//参数:
//string as_title
boolean lb_cont = TRUE
integer li_result, li_size
string ls_title
uint li_handle
li_handle = Handle ( this )
li_size = Len ( at_title ) + 1
//li_handle = FindWindow ( 0, "Control Panel" )
DO WHILE lb_cont
li_handle = GetNextWindow ( li_handle, 1 )
If li_handle = Handle ( this ) THEN Return FALSE
li_result = GetWindowText ( li_handle, ls_title, li_size
)
IF ls_title = as_title THEN lb_cont = FALSE
LOOP
//ShowWindow ( li_handle, 3 )
IF IsIconic ( li_handle ) > 0
THEN
OpenIcon ( li_handle )
ELSE
BringWindowToTop ( li_handle )
END IF
Return TRUE
工作原理
获得另一个应用最顶层窗口引用的最简单方法就是用FindWindow
函数来查找。FindWin dow函数有两个参数:要找的窗口的类名和窗口
的标题。注意,我们在local external函数中用三种方式声明了这一
函数。这是因为可以用null作为"通配符"分别传递两个参数。为了传
递null,必须将参数类型定义成long型,其值为0。所以我们需要为每
一种可能的调用形式定义一个local external函数。当我们真正使用
这个函数时,PowerBuilder自动判断要用哪一种形式。
例如,在窗口函数fw_make_app_active中,我们可以用这种手段使
FindWindow函数搜索C ontrolPanel窗口。接下来只要将FindWindow
函数返回的窗口句柄传递给BringWindowToTop 函数就可以激活Contr
olPanel窗口了。
但是这种做法有两点缺陷:
1.无法知道某个应用的顶层窗口的全名。例如当使用Microsoft
Word时,当前打开的文档的名字也将出现在窗口的标题上。因此,这种
情况下,寻找顶层窗口需要另一种方法。
2.如果要激活的窗口正处于最小化状态,BringWindowToTop函数
将不能正常工作。
实际上,上面提到的第二个问题比较容易解决。我们加入IsIconi
c函数判断要激活的窗口是否最小化。如果不是最小化状态,就使用Br
ingWindowsToTop函数。如果是最小化状态, 就用OpenIcon函数来激
活该窗口。这种方法只假定以窗口最小化前的大小及位置显示该窗口
。我们也可以用Show Window函数来对要显示的其它应用的窗口施以
更多的控制。
本例中,我们传送一个参数使被激活窗口以最大化方式显示。下
表是不同激活窗口方式的参数对照:
表1
解决第二个问题时,我们声明了另外两个函数:GetNextWindow和G
etWindowsText。如果我们将一个窗口句柄传递给GetNextWindow函数
,它将在父窗口所属的所有子窗口之间循环。如果将一个顶层窗口句
柄传递给该函数,该函数将在所有顶层窗口之间循环。我们希望得到
的是后一种方式,所以我们首先要获取自己应用的顶层窗口句柄。
当我们在顶层窗口之间循环时,用GetWindowText函数返回它们的
标题。该函数有三个参数:窗口句柄、一个用以返回标题的字符串以
及返回字符串的最大长度。我们要充分利用最后一个参数,因为我们
并不想要匹配整个窗口标题,而是要匹配能保证我们发现所要寻找的
窗口的长度。例如,如果我们把"Microsoft Word"传递给这个窗口函
数时,这个函数判断文本的长度并将它加1,这样只将我们要比较的字
符串的长度传递给了GetWindowText函数,该函数在顶层窗口之间循环
,寻找以该字符串开头的窗口。如果我们没有发现匹配,将在循环到我
们自己的应用窗口时退出循环。这时,我们简单地退出函数
--
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: hsia.nju.edu.cn]
--
※ 转载:.Top Gun sun20.nuaa.edu.cn.[FROM: 202.119.71.141]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.290毫秒