导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

如何获取打开的窗口的数量

mengqifeng 2006-01-20 04:38:57
请问一下,怎样才能得到在一个application中打开的窗口的数量,搜索了很久都没有发现有类似的问题,希望高手能够解答一下。
...全文
308 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
msgtogcra 2006-02-14
如何遍历用 OpenSheet() 打开的窗口可以参考:
http://community.csdn.net/Expert/topic/4544/4544724.xml?temp=.6323358
回复
msgtogcra 2006-02-10
索性好人做到底,of_get_OpenedWnd() 的代码如下:
不过注意了,我这里滤掉的系统进程仅适用于 win95,其它版本大家自己搞定吧!
/*
功能:
得到当前进程打开的窗口
参数:
aia_openedhwnd[]: 存储打开的窗口句柄数组(输出)
返回值:
成功返回窗口句柄数组的大小;错误返回 -1
*/

ulong ll_processid,ll_buf
uint lia_hwnd[]

int nloop,count,count2=0
string ls_buf

ll_processid = GetCurrentProcessId()
count = of_get_AllWnd(lia_hwnd)

for nloop = 1 to count
GetWindowThreadProcessId(lia_hwnd[nloop], ll_buf)

if ll_buf = ll_processid then
ls_buf = Space(32)
GetWindowText(lia_hwnd[nloop], ls_buf, 32)

choose case ls_buf
case "Default IME", "DDE Server Window", "OleMainThreadWndName"
//

case else
count2 ++
aia_openedhwnd[count2] = lia_hwnd[nloop]
end choose

end if
next

return count2
回复
msgtogcra 2006-02-09
其实这些 API 都不复杂,稍微麻烦一点就是如何获得所有桌面窗口;
下面就给出 of_get_AllWnd() 的代码
/*
功能:
得到所有正在运行的窗口(除桌面窗口本身)
参数:
aia_hwnd[]: 存储正在运行的窗口句柄(输出)
返回值:
成功返回窗口句柄数组的大小;错误返回 -1

*/

uint hwnd
int count=0

do
count ++

if count = 1 then
hwnd = GetWindow(GetDesktopWindow(), 5) // 得到桌面的第一个子窗口
else
hwnd = GetWindow(hwnd, 2) // 得到子窗口的所有兄弟窗口
end if

if hwnd <> 0 then
aia_hwnd[count] = hwnd
else
count --
end if

loop while hwnd <> 0

return count
回复
mengqifeng 2006-02-09
我对这些API的用法不熟,不知道有没有那位兄弟姐妹给个例子。
回复
wwq103 2006-02-08
用API吧,这样通用并且方便些,楼主如果解决了记得来说一声有什么心得和需要注意的地方,造福后人啊^^
回复
mengqifeng 2006-02-05
to qlyscf()
考虑过用计数器,但是窗口多而且杂,很不好判断,所以后来决定不用。
to msgtogcra()
我先试试看
to li_d_s(我是小鬼-日货?送我都不要,哪怕是丰田和日产的轿车)
大部分都不是mdi窗口
回复
distancehalf 2006-01-23
建議你最好是用API
回复
bbdx2523 2006-01-23
楼上的方法可以考虑
回复
qlyscf 2006-01-23
非常简单的办法可以一试,设一全局变量计数器,初值为0,不管什么打开窗口,计数器加1,关闭窗口,计数器减一,如此可否???
回复
msgtogcra 2006-01-23
其实方法还是有,利用以下 API 可以得到当前进程相关的窗口句柄,自然也就知道数量:

FUNCTION ulong GetWindowThreadProcessId(ulong hwnd,ref ulong lpdwProcessId) LIBRARY "user32.dll"
FUNCTION ulong GetDesktopWindow() LIBRARY "user32.dll"
FUNCTION ulong GetWindow(ulong hwnd,ulong wCmd) LIBRARY "user32.dll"
FUNCTION ulong GetCurrentProcessId() LIBRARY "kernel32.dll"
FUNCTION ulong GetWindowText(ulong hwnd,ref string lpString,ulong cch) LIBRARY "user32.dll" ALIAS FOR "GetWindowTextA"

原理是:
取得所有在桌面上运行的窗口,获得该窗口的相关进程标识,与当前应用的进程标识进行比较,可以得到哪些窗口是与当前进程相关的(调试状态下当前进程是 pb 编译器);找到的这些窗口当中有一些是系统进程,通过判断窗口标题,如 Default IME, DDE Server Window, OleMainThreadWndName;过滤掉它们,剩下的就是应用中打开的窗口了。
回复
li_d_s 2006-01-21
如果是mdi还好作,否则恐怕只能自己登记窗口了
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

803

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告