TC官方合作论坛

 找回密码
 立即注册
查看: 1288|回复: 2

[其他] 关于 获取窗口句柄() 获取句柄有误的代替方法

[复制链接]
发表于 2016-4-26 16:55:38 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
窗口句柄 = 获取窗口句柄(进程句柄, 0)
这条命令获取的窗口句柄有误,没办法只能自己找相关的东西解决

使用了 @sam7894604  鬼玺大神的代码
http://bbs.tyuyan.net/forum.php?mod=viewthread&tid=54566&highlight=%E9%AC%BC

  1. 功能 进程ID获取窗口句柄(进程ID,窗口名)
  2.     变量 句柄集 = EnumWindows()
  3.     如果(是否数组(句柄集))
  4.         变量 窗口数量 = 数组大小(句柄集)
  5.         变量 进程PID = API_内存申请(32767), 返回值 = 0
  6.         遍历(变量 i = 0; i < 窗口数量; i ++)
  7.             //调试输出(句柄集[i] & "," & windowgetcaption(句柄集[i]))
  8.             dllcall("user32.dll", "long", "GetWindowThreadProcessId", "long", 句柄集[i], "long", 进程PID)
  9.             //调试输出(地址取值(进程PID, "long"))
  10.             如果(进程ID == 地址取值(进程PID, "long") &&windowgetcaption(句柄集[i]) == 窗口名)
  11.                 返回值 = 句柄集[i]
  12.                 跳出
  13.             结束
  14.         结束
  15.         API_内存释放(进程PID)
  16.         返回 返回值
  17.     结束
  18. 结束

  19. function EnumWindows()
  20.     var 局_返回 = array()
  21.     var 局_函数指针 = callbackmalloc("__EnumFunc", "enumwindowsproc")
  22.     var 局_变量指针 = getvarpointer(局_返回)
  23.     if(局_函数指针 && 局_变量指针)
  24.         if(dllcall("User32.dll", "long", "EnumWindows", "callback", 局_函数指针, "long", 局_变量指针))
  25.             callbackfree(局_函数指针)
  26.             return 局_返回
  27.         end
  28.     end
  29.     callbackfree(局_函数指针)
  30.     return null
  31. end

  32. function EnumChildWindows(参_父句柄)
  33.     var 局_返回 = array()
  34.     var 局_函数指针 = callbackmalloc("__EnumFunc", "enumwindowsproc")
  35.     var 局_变量指针 = getvarpointer(局_返回)
  36.     if(局_函数指针 && 局_变量指针)
  37.         if(dllcall("User32.dll", "long", "EnumChildWindows", "long", 参_父句柄, "callback", 局_函数指针, "long", 局_变量指针))
  38.             callbackfree(局_函数指针)
  39.             return 局_返回
  40.         end
  41.     end
  42.     callbackfree(局_函数指针)
  43.     return null
  44. end

  45. function __EnumFunc(hwnd, lParam)
  46.     var 局_关联
  47.     if(!pointergetvar(lParam, 局_关联))
  48.         return false
  49.     elseif(!isarray(局_关联))
  50.         return false
  51.     elseif(windowisvisual(hwnd) && strlen(windowgetcaption(hwnd)))
  52.         arraypush(局_关联, hwnd)
  53.     end
  54.     return true
  55. end

  56. 功能 API_内存申请(大小)                                                                                //GlobalAlloc      堆栈分配
  57.     返回 动态库调用("Kernel32.dll", "int", "GlobalAlloc", "int", 0, "int", 大小)
  58. 结束
  59. 功能 API_内存释放(hMem)                                                                                //GlobalFree        堆栈释放
  60.     返回 动态库调用("Kernel32.dll", "int", "GlobalFree", "int", hMem)
  61. 结束
复制代码


回复

使用道具 举报

发表于 2016-4-26 17:11:58 | 显示全部楼层
用哪个版本的TC呀?那么简单的功能不至于不准确吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-26 18:02:34 | 显示全部楼层
个人神话 发表于 2016-4-26 17:11
用哪个版本的TC呀?那么简单的功能不至于不准确吧?

TC6.0  用这条命令获得的窗口句柄和spy++得到的不一样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-17 00:07 , Processed in 0.053165 second(s), 22 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表