提几个有关传送消息和按键的API函数问题(200分)

  • 主题发起人 主题发起人 abcxca
  • 开始时间 开始时间
A

abcxca

Unregistered / Unconfirmed
GUEST, unregistred user!
1,如何在我的DELPHI程序中启动一个外部EXE程序,并获得其窗口的句柄?<br>&nbsp; 不是指用搜索的方法找到,因可能会打开多个实例。<br>&nbsp; 有什么API函数可以做到?哪个最好?<br>2,我要向这个外部exe程序的窗口发送按键消息,在使用的过程中发现:<br>&nbsp; &nbsp;keybd_event 函数能发送,但窗口必须为当前活动窗口;<br>&nbsp; &nbsp;用sendmessage则很神奇,无论怎样,发送的字母都是大写的;<br>&nbsp; &nbsp;而postmessage则和keybd_event一样得看Caps Lock的状态。<br>&nbsp; &nbsp;问:有什么方法可自由地发送大小写字母?<br>&nbsp; &nbsp;如果不行哪么用什么方法可以测定Caps Lock的状态?<br>&nbsp; &nbsp;还有用sendmessage和postmessage怎样发送组合键?<br>3,还有就是为什么键值代码中:vk_return 能用,但vk_1 编译时就<br>出错(所有数字键都是这样)?为什么?
 
1.CreateProcess<br>2.关注<br>3.vk_1在windows单元中未定义
 
用createprocess运行进程可以得到他的handle,然后保存供以后发送消息给他。代码如下:<br>function MyWinExec(FileName: Pchar; Visibility: integer): integer;<br>var<br>&nbsp; &nbsp;StartupInfo: TStartupInfo;<br>&nbsp; &nbsp;ProcessInfo: TProcessInformation;<br>&nbsp; &nbsp;str: string;<br>&nbsp; &nbsp;hwnd: Thandle;<br>begin<br>&nbsp; &nbsp;FillChar(StartupInfo, Sizeof(StartupInfo), #0);<br>&nbsp; &nbsp;StartupInfo.cb := Sizeof(StartupInfo);<br>&nbsp; &nbsp;StartupInfo.dwFlags := STARTF_USESHOWWINDOW;<br>&nbsp; &nbsp;StartupInfo.wShowWindow := Visibility;<br>&nbsp; &nbsp;if not CreateProcess(nil,<br>&nbsp; &nbsp; &nbsp; FileName, { pointer to command line string }<br>&nbsp; &nbsp; &nbsp; nil, { pointer to process security attributes }<br>&nbsp; &nbsp; &nbsp; nil, { pointer to thread security attributes }<br>&nbsp; &nbsp; &nbsp; false, { handle inheritance flag }<br>&nbsp; &nbsp; &nbsp; 0,<br>&nbsp; &nbsp; &nbsp; nil, { pointer to new environment block }<br>&nbsp; &nbsp; &nbsp; nil, { pointer to current directory name }<br>&nbsp; &nbsp; &nbsp; StartupInfo, { pointer to STARTUPINFO }<br>&nbsp; &nbsp; &nbsp; ProcessInfo) then<br>&nbsp; &nbsp; &nbsp; Result := -1 { pointer to PROCESS_INF }<br>&nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp; frm_main.TagHwnd := ProcessInfo.hProcess; {全局的变量用来保存句柄以后好发送消息给他}<br>end;
 
to bluelypro:<br>&nbsp; &nbsp;大哥, ProcessInfo.hProcess中返回的不是句柄,<br>&nbsp; &nbsp;例如: ProcessInfo.hProcess中返回的是: 1904<br>&nbsp; &nbsp;而我用 FindWindow搜出来的是: 3409260<br>&nbsp; &nbsp;用3409260才能正常的发消息.用1904不行.<br>&nbsp; &nbsp;
 
倒,hProcess 是进程句柄,和窗口句柄是两回事。<br>你要先枚举所有窗口,然后把每个窗口的进程句柄跟这个 hProcess 相比较,<br>如果相同,那么这个窗口的句柄就是你要的句柄。<br><br>关于如何枚举窗口,论坛上已经有很多帖子了,你搜索一下吧。<br>
 
不好意思,刚才没仔细看题,匆匆忙忙只答了一半。CreateProcess得到的是进程的ID没错,<br>这是第一步,一般来讲要对别的进程做手脚这步是必须的,要进一步得到该进程某个窗口的<br>句柄可以这样实现: 使用BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam)函数<br>枚举进程所有窗口,在该api函数需要传入一个自定义的回调函数,你可以在这个回调函数中<br>判断该窗口的进程ID跟CreateProcess创建得到的进程ID是否相同,如果是的话,就是你要的<br>窗口了。代码如下:<br>var<br>TagHwnd:HWND;<br>TagProcess:DWORD; 定义两个全局变量来保存目标窗口句柄和进程ID<br>//枚举窗口的回调函数<br>function EnumWindowsProc(hhWnd:LongInt;Param:Pointer):boolean;<br>var<br>lpszClassName,lpszWindowText:array[0..254] of char;<br>dwProcessId:DWORD;<br>begin<br>//得到窗口标题<br>GetClassName(hhWnd,lpszClassName,254); //得到窗口类名,演示,如果你根据窗口类名判断就可以用上,不用的话可以去掉<br>GetWindowText(hhWnd,lpszWindowText,254); //得到窗口标题<br>GetWindowThreadProcessId(hWnd,@dwProcessId); //根据窗口句柄得到所属进程ID<br>if (dwProcessId =TagProcess) and (strpas(lpszWindowText)='你要找的窗口标题')) then<br>begin<br>&nbsp; TagHwnd = hhWnd;<br>&nbsp; result = FALSE;<br>end;<br>result = &nbsp;TRUE;<br>end;<br><br>procedure GetProcessMainWnd()<br>begin<br>&nbsp; &nbsp;EnumWindows(@EnumWindowsProc,0);<br>end; <br><br>TagProcess的值可以由上面的MyWinExec函数得到,这样就可以根据进程ID得到该进程内的某个窗口了。上面的代码是刚才临时写的,没有编译测试<br>过(我的机子没装delphi,只有bcb),可能有小错误,但是思路是绝对正确的。你可以试试。<br><br>
 
to bluelypro:<br>&nbsp; &nbsp;怎么在编译 EnumWindows(@enumWindowsProc,0); 这句时出现Variable required 错?<br>我的是DELPHI 7.0<br>还望指教
 
to beta<br>&gt;&gt;关于如何枚举窗口,论坛上已经有很多帖子了,你搜索一下吧。<br>&nbsp; 用什么关键字搜? 劳烦相告.<br>&nbsp;
 
to bluelypro:<br>&nbsp; &nbsp;大哥,原来进程的ID是放在ProcessInfo.dwProcessId 中,而并非ProcessInfo.hProcess.<br>&nbsp; &nbsp;很多谢你.<br>&nbsp; &nbsp;这个问题OK了.但...如何用sendmessage和postmessage发送任何字符的问题,<br>&nbsp; &nbsp;还望你和其他的大富翁帮帮忙,<br>&nbsp; &nbsp;不够分可以加,呵呵!<br>
 
&nbsp; &nbsp; &nbsp;用CreateProcess创建了一个进程,并保留了进程ID号.<br>&nbsp; &nbsp;利用这ID号用EnumWindows函数配合EnumWindowsProc函找用枚举法找该进程的<br>窗口句柄时,发现如果没有找到时, 会出现死循环,如何令EnumWindows在找不到<br>句柄时退出.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
623
import
I
后退
顶部