如何找到应用程序的窗口句柄?(100分)

  • 主题发起人 主题发起人 linfox
  • 开始时间 开始时间
L

linfox

Unregistered / Unconfirmed
GUEST, unregistred user!
为了在一个在内存中运行的应用程序中安装消息处理钩子,必须找到该进程的主window句柄。用什么API函数可以找到呢?我现在只有应用程序名。
 
用spy ++ 确定你主窗体的类名<br>然后FindWindow
 
hwnd := FindWindow(窗体类名,窗体名称));
 
关键是用spy抓到的窗体类名是对应的窗口是唯一的吗?而窗体名是象IE一样,打开什么文件其caption也会跟着改变。所以findwindow()很难,可能要通过枚举进程,找到应用程序的进程,然后再找主window的句柄。但是我不知道用什么函数。谢谢各位DFW了。
 
给你来一段[:D]<br>var<br> &nbsp;curwin, Desktop, len: integer; //当前窗口句柄,桌面句柄(也是一个句柄),窗体标题长度<br> // Style: longint; //窗体类别<br> &nbsp;str: array[0..100] of char;<br>begin<br> &nbsp;lst2.Clear;<br> &nbsp;curwin := 0;<br> &nbsp;Desktop := GetDesktopWindow;<br> &nbsp;repeat<br> &nbsp; &nbsp;curwin := findwindowex(Desktop, curwin, nil, nil); //找他的子窗体<br> &nbsp; &nbsp;len := GetWindowTextLength(curwin); //长度<br> &nbsp; &nbsp;if IsWindowVisible(curwin) //可见<br> &nbsp; &nbsp; &nbsp;and ((GetWindowLong(curwin, GWL_HWNDPARENT) = 0) or //是一级窗体<br> &nbsp; &nbsp; &nbsp;(HWND(GetWindowLong(curwin, GWL_HWNDPARENT)) = GetDesktopWindow))<br> &nbsp; &nbsp; &nbsp;and ((GetWindowLong(curwin, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)<br> &nbsp; &nbsp; &nbsp;then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;getwindowtext(curwin, str, 255);<br> &nbsp; &nbsp; // showmessage(str);<br> &nbsp; &nbsp; &nbsp;lst2.Items.Add(str);<br> &nbsp; &nbsp;end;<br> &nbsp;until curwin = 0;<br> &nbsp;curwin := 0;<br> &nbsp;Desktop := GetDesktopWindow;<br><br> &nbsp;lbl2.Caption := '应用程序:'+IntToStr(lst2.Items.Count);<br>end;
 
多人接受答案了。
 
后退
顶部