当前位置:编程学习 > VB >>

如何获得经常窗口标题经常变化的窗口句柄

各位老师: 请教一个问题

   我需要用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

  我想这是我应该需要的东西, 再一次谢谢各位。
  
--------------------编程问答-------------------- 顶一下:) --------------------编程问答--------------------
引用 8 楼 zgznn 的回复:
  感谢各位的回复,我好象找到了我想要的东西 , 至于说enumwindows 这个我可能不需要试了。

微软官方给了我一个函数 不叫  findwindow  叫findwindowlike

具体可以参见  http://support.microsoft.com/kb/147659

  我想这是我应该需要的东西, 再一次谢谢各位。
 


enumwindows的通用性更强一点。
你的办法针对你的问题也是可行的。 --------------------编程问答-------------------- 向各位老大学习 --------------------编程问答-------------------- 路过…… --------------------编程问答-------------------- 楼主说的FindWindowLike也就是MS封装了大家说的这些API啦:) --------------------编程问答-------------------- --------------------编程问答--------------------

FindWindowLike 只是 微软给出的代码,对一下API进行进一步封装.

 
  Declare Function SetFocusAPI Lib "user32" Alias "SetForegroundWindow" _
    (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
--------------------编程问答-------------------- 只能研究一下文件名称变化的规律,再使用FindWindow --------------------编程问答-------------------- 能够自己发现并解决问题最好了 --------------------编程问答-------------------- 不管窗口标题如何变化,总是可以枚举到的并加以比较的:
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 ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,