关于SendMessage,(问题没结束呢,继续来高手啊); (20分)

  • 主题发起人 易名烦
  • 开始时间

易名烦

Unregistered / Unconfirmed
GUEST, unregistred user!
有一程序,上有很多EDIT,不是DEPHI写的,光标正定位在某一EDIT上,我向窗口发送<br>消息:SendMessage(R3Hwnd,WM_KeyDown,65,0);其中65是"A",但EDIT中无反应。<br>我是这样理解的,窗口中的很一控件都有自己的HANDLE,要向对应的HANDLE中发消息。<br>(不知道对不对)<br>&nbsp; &nbsp; 如果是这样,我要怎么找到光标所在的EDIT的HANDLE呢?
 
你可以发送SENDMESSAGE(WINDOWSHANDLE,WM_COMMAND,参数1,参数2);<br>通过参数来发送你要设置的字符,这个最好查MSDN
 
什么啊,参数就是按键值吧?<br>我现在要搞懂怎么向指定的EDIT发消息。<br>怎么取得光标所在EDIT的HANDLE。
 
这个很简单,用一个API就可以取得光标过在的窗口的句柄,<br>你再看他是不是EDIT类的,如果是就直接设置他的内容<br>
 
可以教我吗?
 
要获取当前鼠标位置的句柄和类名,只须通过 WindowFromPoint和GetClassName<br>&nbsp; &nbsp;格式为:hWnd := WindowFromPoint(sender);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetClassName(hWnd,aName,256);<br>说明hwnd为thandle类型变量,sender为tpoint类型变量,aname为array [0..255] of char数组类型
 
对不起,我用的是这个程序去控制别一个程序(光标非鼠标)。<br>应该要用到别一个窗口的HNADLe.
 
首先,你要得到另一个窗体的句柄,可以用findWindow得到,<br>然后遍历它的子窗体:EnumChildWindows,然后用GetClassName()判断是不是TEdit<br>类(如果是vc写的是Edit类),如果是的话,就postMessage
 
薄荷:<br>&nbsp; &nbsp; 但有很多的TEdit啊,怎么知道光标所在处的TEdit的Handle?
 
来人啊:<br>如果有EnumChildWindows()怎么用别有分相赠。<br>因为哪个回调函数实在搞不太懂。
 
张无忌同志也是,就这样就不来看了。
 
光标所在不会用是否处理焦点状态判断不就知道了
 
能简单写两句吗?
 
遍历子窗体:<br>implementation<br>var Hchild: integer;<br><br>function EnumProc(Hwnd: THandle;lparam: LPARAM): boolean; stdcall;<br>var<br>&nbsp; lpText: Array[0..255] of char;<br>begin<br>&nbsp; &nbsp;Result := true;<br>&nbsp; &nbsp;GetClassName(hwnd,@lpText,255);<br>&nbsp; &nbsp;if (lptext)='Edit' then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; HChild := HWnd;<br>&nbsp; &nbsp; &nbsp; Result := false;<br>&nbsp; &nbsp;end;<br>end;<br>function TForm1.GetEditHandle(WinCap: string): integer;<br>var<br>&nbsp; hParent: THandle;<br>&nbsp; i: integer;<br>begin<br>&nbsp; &nbsp;Result := 0;<br>&nbsp; &nbsp;hChild := 0;<br>&nbsp; &nbsp;hParent := FindWindow(nil,pchar(WinCap));<br>&nbsp; &nbsp;if hParent=0 then exit;<br>&nbsp; &nbsp; &nbsp;EnumChildWindows(hParent,@EnumProc,0);<br>&nbsp; &nbsp; &nbsp;Result := hChild;<br>end;
 
其实这个问题好像不要那么复杂阿,<br><br>不就是模拟按钮吗,你只要模拟按键,发几个字符,他不就自然发到有焦点的edit里了?<br>delphi5里面有个sendkey单元,不知道6里面有没有。如果有的话就太简单了。<br><br>我还知道delphi5开发人员指南的光盘里有。如果你要我找给你把。
 
function EnumProc(Hwnd: THandle;lparam: LPARAM): boolean; stdcall;<br>var<br>&nbsp; lpText: Array[0..255] of char;<br>begin<br>&nbsp; &nbsp;Result := true;<br>&nbsp; &nbsp;GetClassName(hwnd,@lpText,255);<br>&nbsp; &nbsp;if ((lptext)='Edit') and (GetFocus = hwnd) &nbsp;then //比较是否和焦点句柄相同<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; HChild := HWnd;<br>&nbsp; &nbsp; &nbsp; Result := false;<br>&nbsp; &nbsp;end;<br>end;<br>
 
模拟按键要把窗口变成当前窗口吧。
 
可以改简单点,先用GetFocus取得Handle,然后再用GetClassname取得是否是Edit类,这样<br>就不要遍历了,效率提高太多了,最好再用key_event来完成就行了,不要写出代码吧,<br>很简单的了
 
不是当前窗口有焦点吗?
 
啊,我以为有key_event呢,原来没有,那你可用以sendkey来完成吧<br><br>VB的一段代码,用的是postMessage<br><br>N = CInt(Mid(RFID, 10 - ws(w) + i, 1))<br>Msg = WM_CHAR<br>wParam = vbKey0 + N<br>lParam = (&amp;HC000 + ScanCode(N)) * &amp;H10000 + 1<br>PostMessage ActWnd, Msg, wParam, lParam
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
回复
0
查看
1K
天地弦
顶部