很有意思的一个问题!大家帮帮忙!我在程序中取得了别一个Delphi程序Application的句柄,请问如何再得到这个程序的主窗口呢?(50分)

  • 主题发起人 主题发起人 iyesno
  • 开始时间 开始时间
I

iyesno

Unregistered / Unconfirmed
GUEST, unregistred user!
我头都大了!<br>我在程序中取得了别一个Delphi程序的Application句柄想用API隐藏和显示程序的主窗口<br>但对的Application句柄用只能隐藏它在任务栏的那个按钮,我想只有得到主窗口句柄对它<br>用才行!我想用GetWindowThreadProcessId打开进程来找可能OK!但我不会!请大家帮帮<br>忙!<br>showwindow(主窗口句柄,SW_HIDE);//隐藏<br>showwindow(主窗口句柄,SW_SHOW);//显示<br><br>还有我用了SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE); <br>使别的程序[总在最前]就是窗口最前!请问要用什么方法才能去除它的[总在最前]就是<br>窗口最前呢?和Windows的程序管理器(Ctrl+Alt+Del)的菜单第二项中的[前端显示]!
 
使用EnumWindows能列这进程的全部窗口<br>如:<br>窗口句柄:3343832,窗口类名:TForm4,窗口标题:Form4<br>窗口句柄:4261458,窗口类名:TForm1,窗口标题:Form1<br>窗口句柄:14222950,窗口类名:TForm3,窗口标题:Form3<br>窗口句柄:26019376,窗口类名:TForm2,窗口标题:Form2<br>窗口句柄:4064762,窗口类名:TApplication,窗口标题:Project1<br>窗口句柄:1574610,窗口类名:MSCTFIME UI,窗口标题:M<br>窗口句柄:2295382,窗口类名:IME,窗口标题:Default IME<br><br>但我没有法在它们中找到主窗口!<br>大家帮帮忙!
 
分不明谁是主窗口
 
想通过Application获得外部程序主窗口不太容易.<br>VCL和MFC一样.都是Application是一个1X1的不可见窗口.他们才是真正的主窗口.任务栏上面的按钮对应的就是他们.而我们的主Form其实对他们来说也是一个普通的Form而已.<br><br>建议你现确定它们的主Form类的类名.以后用FindWindow这个API来查找到对应的窗口.<br><br> &nbsp;H := FindWindow('主窗口的类名',nil);<br> &nbsp;if H = 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;//没找到<br> &nbsp;end<br> &nbsp;else<br> &nbsp;begin<br> &nbsp; &nbsp;//找到了<br> &nbsp;end;
 
用这个判断:<br>function IsMainWindow(AHandle: THandle): Boolean;<br>var<br> &nbsp;nParentWnd: THandle;<br> &nbsp;nExStyle: DWORD;<br>begin<br> &nbsp;if IsWindowVisible(AHandle) then<br> &nbsp;begin<br> &nbsp; &nbsp;nParentWnd := GetWindowLong(AHandle, GWL_HWNDPARENT);<br> &nbsp; &nbsp;nExStyle := GetWindowLong(AHandle, GWL_EXSTYLE);<br> &nbsp; &nbsp;Result := ((nParentWnd = 0) or (nParentWnd = GetDesktopWindow)) and<br> &nbsp; &nbsp; &nbsp;((nExStyle and WS_EX_TOOLWINDOW = 0) or (nExStyle and WS_EX_APPWINDOW &lt;&gt; 0));<br> &nbsp;end<br> &nbsp;else Result := False;<br>end;
 
to LSUPER<br>你的这个function IsMainWindow(AHandle: THandle): Boolean;只能确认Application窗口
 
那么我用了SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE); <br>使别的程序[总在最前]就是窗口最前!请问要用什么方法才能去除它的[总在最前]就是<br>窗口最前呢?和Windows的程序管理器(Ctrl+Alt+Del)的菜单第二项中的[前端显示]!<br><br>回答这个我一样给全分!!@!!@!
 
毛了哟,一个一个试三,一般Form1是主窗口,因为是第一个创建
 
后退
顶部