如何获得经常窗口标题经常变化的窗口句柄
各位老师: 请教一个问题我需要用VB 获得一个窗口句柄。 某高人介绍 用
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
这个函数, 我试过了,这个函数很好用,很容易找到具有某个窗口标题的句柄 ,如windows 自带的固定标题的程序窗口比如“计算器”等。
但现在问题来了,这个函数只能找到具有固定标题的窗口句柄,但如果这个窗口标题在运行的过程中不是固定的,而是稍有变化,那么我就无能为力了。
现在请问各位大大, 能否给出一段代码 用VB获得具有某个关键字的窗口句柄。
举个例子。 我需要一直监督windows 下“记事本” 这个程序窗口。 在缺省打开时,他会显示“无标题-记事本”
如果我随便写两个字,另存为1.txt 那么打开后就变成 "1-记事本" 同理还可以存为2-记事本 3-记事本
但不管窗口如何变化,这个窗口总有个关键字 记事本。 能否通过只查找具有某个关键字“记事本” 来获得这个窗口的句柄?
谢谢! 一个初学者
--------------------编程问答-------------------- 变了不就不是原来的东西了吗 --------------------编程问答-------------------- 枚举窗口,取得标题,进行比对 --------------------编程问答-------------------- 那就枚举Handle,找ProcessID,然后找到程序名。
或者找Window Class --------------------编程问答-------------------- 1.窗口标题变了当然找不到原来的, 但是如果是有规则的变化,则你可以枚举所有的窗口, 再用 Instr找看是否有 "记事本" 三个字, 而不用管前面的 123
2.可以用 notpad.exe 查找, 当然你exe重命名我也没辙, 总之你要先有个 "特定的条件" 才能完成你这个天才的需求. --------------------编程问答-------------------- EnumWindows() 枚举所有顶层窗口。
然后看有没有窗口的文本中包含记事本3个字。 --------------------编程问答-------------------- 4楼是大师吧,感谢各位的回复。
我举记事本只不过举个例子而已,并不是真要查找记事本 notepad.exe 也不是说EXE 变化。
我只是想监督某个固定的窗口, 取得这个窗口的句柄以后控制这个窗口作一些我想要作的事。
再说明白点吧,这个窗口就放在那里。 标题有时会发生一些变化, 但不会变得面目全非,总有一个关键字是不变的,我们姑且说这个关键字就是“记事本” ,比如他的标题可以一开始是 1-记事本 过了十分钟后这个窗口变为 2-记事本。 窗口还是他不会发生变化, 但就是标题稍有变化。 但关键字是有固定不变的。
并非是关键字都没规律都找不到,那样我也不会提这个问题了。
2楼3楼的枚举 是一个想法,不过几位都是教授级人物,几个名词就意会言传了,可惜在下只是个小学生,对于这些想法还是不知如何下手, 间或是在下确实有点“懒” 需要的是拿来即可用的实用的东西,
几位教授能否给在下码几行代码, 谢谢。
--------------------编程问答-------------------- http://www.google.cn/search?hl=zh-CN&source=hp&q=enumwindows+byval+as+long&aq=3&oq=
注意我用的搜索关键词。 --------------------编程问答--------------------
感谢各位的回复,我好象找到了我想要的东西 , 至于说enumwindows 这个我可能不需要试了。
微软官方给了我一个函数 不叫 findwindow 叫findwindowlike
具体可以参见 http://support.microsoft.com/kb/147659
我想这是我应该需要的东西, 再一次谢谢各位。
--------------------编程问答-------------------- 顶一下:) --------------------编程问答--------------------
enumwindows的通用性更强一点。
你的办法针对你的问题也是可行的。 --------------------编程问答-------------------- 向各位老大学习 --------------------编程问答-------------------- 路过…… --------------------编程问答-------------------- 楼主说的FindWindowLike也就是MS封装了大家说的这些API啦:) --------------------编程问答-------------------- --------------------编程问答--------------------
FindWindowLike 只是 微软给出的代码,对一下API进行进一步封装.
Declare Function SetFocusAPI Lib "user32" Alias "SetForegroundWindow" _--------------------编程问答-------------------- 只能研究一下文件名称变化的规律,再使用FindWindow --------------------编程问答-------------------- 能够自己发现并解决问题最好了 --------------------编程问答-------------------- 不管窗口标题如何变化,总是可以枚举到的并加以比较的:
(ByVal hwnd As Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetWindowLW Lib "user32" Alias "GetWindowLongA" _
ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) _
As Long
http://topic.csdn.net/u/20090316/18/29aa77dd-c789-4f89-a7db-b4e274e0fcab.html
--------------------编程问答-------------------- 窗口标题即便是动态的,变化也应该是有限的吧。 --------------------编程问答-------------------- 可执行的exe文件是不会变化的,可以先枚举窗口,根据窗口句柄找到窗口对应的进程id,再根据进程id找到窗口对应的exe名称,然后就可以把这个进程下所有的窗口枚举出来。一般情况每个进程的各个窗口的类名都是不一样的,你要找的窗口肯定是顶层窗口,也就是没有WS_CHILD属性的窗口。你可以用Spy++来查看你要监控的窗口,获得一些固定不变的信息,然后写成相关的查找代码。 --------------------编程问答-------------------- 如果经常变的话,还可考虑使用Enumwindows吧,这样可以先枚举窗口,再使用GetWindowThreadProcessId获得窗口所在进程,最后使用GetModuleFileName获得进程的可执行文件名称,这样应该可以获得需要的窗口了吧? --------------------编程问答-------------------- Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
有两个参数,一个是类名,一个是窗口名。如果你仅仅是查找记事本:
TemphWnd = FindWindow("Notepad", vbNullString)
--------------------编程问答-------------------- Mark
--------------------编程问答--------------------
补充:VB , 基础类