用CreateProcess创建一个新的进程的窗口句柄和位置问题(20分)

  • 主题发起人 主题发起人 xj_zhong
  • 开始时间 开始时间
X

xj_zhong

Unregistered / Unconfirmed
GUEST, unregistred user!
1)、CreateProcess创建的第三方新进程的窗口句柄有什么方法可以获得吗?<br>我是想能不能在创建的时候就直接获的到他的窗口句柄,而不是在窗口显示出来后再通过窗口的标题去得到。<br><br>2)、还有怎么固定创建的第三方新进程窗口的位置.
 
1、CreateProcess返回的ProcessInfomation中有ThreadId和Thread Handle,然后用EnumThreadWindows就可以获取窗口句柄了。 不过在CreateProcess返回后应当sleep一会才去EnumThreadWindows, 否则可能查不到(process还没来得及创建窗体)。<br>2、找到window handle了之后就可以用setwindowpos调整位置和大小了
 
to:Another_eYes<br>&nbsp;谢谢了!<br>CreateProcess里倒数第2个参数lpStartupInfo是一个结构体,里面可以设置窗口的位置和大小,但我使用的时候对有的进程窗口可以改变位置和大小,但对某些进程又不能。请问是什么原因?
 
是不是某些程序不响应改变大小的消息呀?<br><br>又见Another_eYes大虾,真高兴啊![:D]
 
你看一下TForm的Position属性就可以知道了,默认Position属性是poDesigned,也就是说即使你在lpStartupInfo中指定了窗口大小与位置,程序创建form时还是会将这个值改成设计时的大小和位置的。lpSTartupInfo中指定的位置和大小只在Position为poDefaultxxxx时才有效
 
To Another_eYes:<br>让我明白很多了,太感谢了,前几天我一直在纳闷这是什么回事呢?<br><br>还有一个问题:<br>我在用EnumThreadWindows枚举窗口句柄时的问题:<br><br>function Nokia_EnumWindowsFunc(Handle: THandle;lparam: Longint) : boolean ; stdcall; &nbsp; &nbsp;//回调函数<br>var<br>&nbsp; title:array[0..254] of Char;<br>begin<br>&nbsp; &nbsp; &nbsp; Nokia_winhandlenum := Nokia_winhandlenum + 1;<br>&nbsp; &nbsp; &nbsp; Nokia_winhandles[Nokia_winhandlenum].handle := handle;<br>&nbsp; &nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; if GetWindowText(Handle,title,250) &lt;&gt; 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Nokia_winhandles[Nokia_winhandlenum].title := title;<br>&nbsp; &nbsp; &nbsp; except;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; Result :=True; &nbsp; &nbsp; <br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br>&nbsp; &nbsp;sdhfilename:String;<br>begin<br>&nbsp; lct_sinfo :TSTARTUPINFO;<br>&nbsp; lct_pinfo :TPROCESSINFORMATION;<br>&nbsp; lct_sinfo.cb := Sizeof(StartupInfo);<br>&nbsp; lct_sinfo.lpReserved := 0;<br>&nbsp; lct_sinfo.lpDesktop := 0;<br>&nbsp; lct_sinfo.dwX:=0;<br>&nbsp; lct_sinfo.dwY:=0;<br>&nbsp; lct_sinfo.dwXSize:=800;<br>&nbsp; lct_sinfo.dwYSize:=800;<br>&nbsp; lct_sinfo.dwFlags := STARTF_USEPOSITION or STARTF_USESIZE;<br>&nbsp; lct_sinfo.cbReserved2 := 0;<br>&nbsp; lct_sinfo.lpReserved2 := 0;<br>&nbsp; LockWindowUpdate(GetDesktopWindow());<br>&nbsp; sdhfilename := 'c:/Project1.exe';<br>&nbsp; if not CreateProcess(nil,<br>&nbsp; pchar(sdhfilename),<br>&nbsp; nil,<br>&nbsp; nil,<br>&nbsp; false,<br>&nbsp; HIGH_PRIORITY_CLASS,<br>&nbsp; nil, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; nil,<br>&nbsp; lct_sinfo,<br>&nbsp; lct_pinfo) then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp;exit;<br>&nbsp; end &nbsp;;<br>&nbsp; LockWindowUpdate(0);<br>&nbsp; Sleep(1000);<br>&nbsp; Nokia_winhandlenum := 0;<br>&nbsp; EnumThreadWindows(lct_pinfo.dwThreadId,@Nokia_EnumWindowsFunc,0); &nbsp;//枚举启动<br>//的窗口句柄。<br>end;<br><br>但用上面的函数我枚举出来的窗口句柄有很多个,我查看了一下,有7,8个,我启动的就是一个窗口,怎么有这么多的窗口句柄呢?<br><br>
 
可能是这样的,还有些隐藏的默认窗口,只是我们平时看不见。<br>比如,每个程序都会自动加中文输入法IME窗口,[:)]
 
那么我要在我的程序里关闭打开的第3方程序时,打开的那些窗口都要关闭吗?<br>可能我同时打开了若干次那个第3方程序。不全部关闭会不会出什么问题?
 
不,你只要执行TerminateProcess('目标进程句柄, 0(这个参数一般都为0,你也可以用GetExitCodeProcess来取得它的退出码)),TerminateProcess原型:<br>BOOL TerminateProcess(<br>&nbsp; &nbsp; HANDLE hProcess, // handle to the process <br>&nbsp; &nbsp; UINT uExitCode // exit code for the process &nbsp;<br>&nbsp; &nbsp;); <br>执行后系统会结束目标进程,但不一定会成功。例如你结束的是一个系统进程。
 
一个进程结束的时候 其所有窗口都会关闭 <br>一般来说 当主窗口关闭 进程就会结束
 
to Kevin.C:<br>BOOL TerminateProcess(<br>&nbsp; &nbsp; HANDLE hProcess, &nbsp;// handle to the process <br>&nbsp; &nbsp; UINT uExitCode &nbsp;// exit code for the process &nbsp;<br>&nbsp; &nbsp;); &nbsp;<br>那个hProcess是不是ProcessInfomation里的Thread Handle呢?<br>
 
HANDLE hProces是程序的主线程,我以前做的是用OpenProcess打开进程(一定要打开进程,以便取得相应的权限)然后再用TerminateProcess结束进程。OpenProcess的用法你去看一下msdn吧,很简单。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部