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

  • 主题发起人 易名烦
  • 开始时间
你的调试代码是不是写在了一个button里了,每次按焦点都变了,[:D]
 
这个不关BUTTON的事,我是控制另一个窗口,不是自己做的程序。
 
见鬼,如果要当被控制窗体在当前工作行吗? 行我就做一个给你
 
对不起,不行,我执行这程序时要做其它事情!
 
难道非要做KEYBD_EVENT吗?
 
i dont know
 
高手出招啊!
 
我用的好好的,没问题啊<br>就用GetWindow得到TEdit/Edit的句柄,<br>用PostMessage/SendMessage发送WM_CHAR消息<br>改IE的地址栏内容都没问题
 
astros:<br>&nbsp; &nbsp; 如果一个窗口中有两个EDIT,现在我要向光标所在的哪个SENDMESSAGE,怎么办?
 
keybd_event(65,0,0,0);就可以输入a了
 
<br>&nbsp;SendMessage(hwnd,WM_SETTEXT,0,LongInt('sdf sdf sfs df')));
 
function input_process(var str : array of m_H : THandle) : boolean ; stdcall;<br>var<br>&nbsp; h_Wnd : HWND;<br>&nbsp; num : array[0..3] of char ;<br>&nbsp; dwThreadID, dwCurrentThreadID : DWORD;<br>&nbsp; pt: TPoint;<br>&nbsp; CR_flag : BYTE;<br>&nbsp; old_hkl ,myhkl: HKL;<br>&nbsp; setflag : integer;<br>&nbsp; i : integer;<br>&nbsp; main_handle : THandle;<br>&nbsp; h_imc,h2 : HIMC;<br>&nbsp; test :HWND;<br>&nbsp;// h_point : LPSTR;<br>begin<br>&nbsp; main_handle := Frm_H;<br>&nbsp; CR_flag := $0d;<br>&nbsp; setflag := 0;<br>&nbsp; &nbsp; //检查哪个窗口掌握光标<br>&nbsp; &nbsp; GetCursorPos(pt);<br>&nbsp; &nbsp; h_Wnd := WindowFromPoint(pt);<br>&nbsp; &nbsp; //获得光标所有者的线程ID<br>&nbsp; &nbsp; dwThreadID := GetWindowThreadProcessId(h_Wnd,nil);<br>&nbsp; &nbsp; //获得当前线程的ID<br>&nbsp; &nbsp; dwCurrentThreadID := GetCurrentThreadId();<br>&nbsp; &nbsp; old_hkl := GetKeyBoardLayOut(0); &nbsp;//保存旧的HKL<br>&nbsp; &nbsp; if (dwCurrentThreadID &lt;&gt; dwThreadID) then &nbsp;//如果输入焦点在别的线程<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; if AttachThreadInput(dwThreadID,dwCurrentThreadID,True) then //连接线程<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; h_Wnd := GetFocus();{因为线程已连接,所以能取得正确的Handle}<br>&nbsp; &nbsp; &nbsp; &nbsp; PostMessage(h_Wnd,WM_CHAR,WPARAM(str),1);<br>&nbsp; &nbsp; &nbsp; &nbsp; AttachThreadInput(dwThreadID,dwCurrentThreadID,False); //解除线程连接<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp;...
 
to sanmzhou:<br>agree<br>但是AttachThreadInput只影响按键状态,应该用GetKeyboardState和SetKeyboardState,而不是GetKeyboardLayout吧?<br>还有,易名烦好象可以知道目的窗口的Handle,不必这么麻烦吧?而且GetCursorPos是得到鼠标光标的位置,和键盘输入光标无关。
 
procedure TForm1.Button5Click(Sender: TObject);<br>Var<br>&nbsp;Bh: Pchar;<br>&nbsp;I: Integer;<br>begin<br>&nbsp;bh := Pchar(Uppercase('596-030117-002'));<br>&nbsp;Sleep(2000);<br>&nbsp;for I := 0 to Length(bh) - 1 do Begin<br>&nbsp; KeyBd_Event(Ord(Bh),MapVirtualKey(Ord(Bh),0),0,0);<br>&nbsp; KeyBd_Event(Ord(Bh),MapVirtualKey(Ord(Bh),0),KeyEventF_KeyUp,0);<br>&nbsp;End;<br>end;<br>结果出来是:596030117002 ,'-'却不见了,怎么办?
 
to astros,<br>&nbsp; GetKeyboardLayout()是我自己程序中的,由于copy时没删除。<br>我想对一个拥有输入焦点的窗口来说,鼠标光标和键盘光标是没区别的吧?<br>易名烦,其实用在输入字符串时用 PostMessage()等更方便,<br>而模拟按键在模拟命令等按键(如发送热键)时,比较管用!<br>
 
我准备结贴了,因为我做不出来了,只有用KeyBd_Event()做了。
 
数上用鼠标定位.键盘动作的API.是一种方法.不过这样程序运行的时候,自己就不能乱动了.<br>用API,EnumWindows(),EnumChildWindows(),FindWindow,等窗口管理函数找到SendMessage()<br>或PostMessage()所需要窗口的hWnd.<br><br>找到之后就发送吧.<br>
 
怎么会做不出来呢?sanmzhou的方法就很好<br>1.GetForegroundWindow得到前台窗口Handle<br>2.GetWindowThreadProcessId得到前台窗口线程ID<br>3.AttachThreadInput连接前台线程消息队列<br>4.GetFocus得到拥有输入聚焦的Edit的Handle<br>5.SendMessage/PostMessage发送消息<br>6.AttachThreadInput脱离消息队列连接<br>我试着很好,怎么会做不出来呢?
 
多人接受答案了。
 

Similar threads

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