使用SendMessage 模拟鼠标点击

Game4s 2008-11-16 11:42:20
已知目标窗口的句柄 hWnd
如何根据自定义的X,Y坐标值使用SendMessage向目标窗口发送鼠标点击指令?
请给出实例代码.非常感谢

...全文
1784 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyq2008 2008-11-17
  • 打赏
  • 举报
回复
SendMessage(hWnd,WM_LMOUSEDOWN,x,y);
zhangxiaommmm 2008-11-17
  • 打赏
  • 举报
回复
GetCursorPos(m);是取鼠标位置。
WindowFromPoint(m)是取M坐标点处的句柄,在这里当然也就是鼠标的位置。
sendMessage(WindowFromPoint(m), WM_LBUTTONDOWN, 0, 0);
SendMessage(WindowFromPoint(m), WM_LBUTTONUP, 0, 0);
yuqianyi1974 2008-11-17
  • 打赏
  • 举报
回复
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, makelparam(x,y));
zhaoxiaohao 2008-11-17
  • 打赏
  • 举报
回复
用RegisterwindowMessage注冊唯一窗口标识
send方
var
Form1: TForm1;
UserMessage:UINT;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(FindWindow('TForm1','RegisterMessage Get Example'),UserMessage,0,0);
//'RegisterMessage Get Example'接受窗口名字caption
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage:=RegisterwindowMessage('System Wide User Defined Message');
end;

get方:
var
Form1: TForm1;
UserMessage:UINT;

implementation

{$R *.dfm}

procedure TForm1.DefaultHandler(var Msg);
begin
inherited DefaultHandler(Msg);

if (TMessage(Msg).Msg=UserMessage) then
begin
button1.Click;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage:=RegisterWindowMessage('System Wide User Defined Message');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('ok');
end;
yuqianyi1974 2008-11-17
  • 打赏
  • 举报
回复
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, makelparam(x,y));
yuqianyi1974 2008-11-17
  • 打赏
  • 举报
回复
SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, makelparam(x,y));
Game4s 2008-11-17
  • 打赏
  • 举报
回复
自己解决了。
其实关键就是lParam 的格式问题.
前面几位回答的MakeLParam 函数没有尝试过,自己用了个
StrToInt(#36+IntToHex(Y,4)+IntToHex(X,4)))
达到了预期效果。结贴给分了
w5750584 2008-11-17
  • 打赏
  • 举报
回复
用mouse_event 函数多好
模拟键盘鼠标操作飞信界面发送短信 private void SendSMS() { #if DEBUG string[] addr = new string[] { "闻佃来"}; #else string[] addr = new string[] { "张三", "李四"}; #endif string message = " "; if (message == "") return; Rectangle rect = new Rectangle(); Windows wins = new Windows(); IntPtr hwin = IntPtr.Zero; foreach (Window w in wins) { if (w.Title.IndexOf("发短信") >= 0) { hwin = w.hWnd; break; } } //未找到发送窗口,点击主窗口下的短信发送按钮 if (hwin == IntPtr.Zero) { wins = new Windows(); foreach (Window w in wins) { if (w.Title.IndexOf("飞信2013") >= 0) { //唤醒屏保 Win32.SetCursorPos(10,10); Win32.mouse_event(Win32.MOUSEEVENTF_MOVE, 50, 50, 0, 0); Thread.Sleep(1500); Win32.ShowWindow(w.hWnd, Win32.SW_SHOWNORMAL); Win32.SetForegroundWindow(hwin); Win32.GetWindowRect(w.hWnd, ref rect); IntPtr hDesk = Win32.GetDesktopWindow(); Rectangle rdesk = new Rectangle(); Win32.GetWindowRect(hDesk,ref rdesk); if (rect.Y < 0) { //上 Win32.SetCursorPos(rect.X +(rect.Width-rect.X)/2,0); Win32.mouse_event(Win32.MOUSEEVENTF_MOVE, 0, 1, 0, 0); Thread.Sleep(1500); Win32.GetWindowRect(w.hWnd, ref rect); } else if (rect.Y >= rdesk.Height - 3) { //下 Win32.SetCursorPos(rect.X + (rect.Width - rect.X) / 2,rdesk.Height); Win32.mouse_event(Win32.MOUSEEVENTF_MOVE, 0, -1, 0, 0); Thread.Sleep(1500); Win32.GetWindowRect(w.hWnd, ref rect); } else if (rect.X <= 0) { //左边 Win32.SetCursorPos(0, rect.Y + (rect.Height - rect.Y) / 2); Thread.Sleep(2000); Win32.mouse_event(Win32.MOUSEEVENTF_MOVE, 1, 0, 0, 0); Thread.Sleep(1500); Win32.GetWindowRect(w.hWnd, ref rect); } else if (rect.X >= rdesk.Width - 3) { //右边 Win32.SetCursorPos(rdesk.Width, rect.Y + (rect.Height - rect.Y) / 2); Thread.Sleep(2000); Win32.mouse_event(Win32.MOUSEEVENTF_MOVE, -1, 0, 0, 0); Thread.Sleep(1500); Win32.GetWindowRect(w.hWnd, ref rect); }else { Win32.MoveWindow(w.hWnd, rect.Left, 0, rect.Width - rect.Left, rect.Height - rect.Top, true); Win32.GetWindowRect(w.hWnd, ref rect); Thread.Sleep(300); } Win32.SetCursorPos(rect.X+70,rect.Height-50); Win32.mouse_event(Win32.MOUSEEVENTF_LEFTDOWN | Win32.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); Thread.Sleep(2000); break; } } //再次查找发送窗口 wins = new Windows(); foreach (Window w in wins) { if (w.Title.IndexOf("发短信") >= 0) { hwin = w.hWnd; break; } } } //查询发送窗口成功 if (hwin != IntPtr.Zero) { Win32.ShowWindow(hwin, Win32.SW_SHOWNORMAL); Win32.SetForegroundWindow(hwin); Win32.GetWindowRect(hwin, ref rect); IntPtr hwndtel = Win32.WindowFromPoint(rect.Left + 120, rect.Top + 45); IntPtr hwndsend = Win32.WindowFromPoint(rect.Left + 50, rect.Height - 60); //单击地址栏 Win32.SetCursorPos(rect.Left + 120, rect.Top + 45); Win32.mouse_event(Win32.MOUSEEVENTF_LEFTDOWN | Win32.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); Thread.Sleep(1000); //加入地址 for (int i = 0; i < addr.Length; i++) { Clipboard.SetText(addr[i]); Thread.Sleep(200); Win32.SendMessage(hwndtel, Win32.WM_PASTE, 0, 0); Thread.Sleep(300); Win32.SendMessage(hwndtel, Win32.WM_KEYDOWN, 0X0D, 0);//发 Win32.SendMessage(hwndtel, Win32.WM_KEYUP, 0X0D, 0); //送 Win32.SendMessage(hwndtel, Win32.WM_CHAR, 0X0D, 0); //回车 Thread.Sleep(300); } //加入消息文本 Clipboard.SetText(message); Thread.Sleep(200); Win32.SendMessage(hwndsend, Win32.WM_PASTE, 0, 0); Thread.Sleep(200); #if DEBUG #else if (!_TestMode) { Win32.SendMessage(hwndsend, Win32.WM_KEYDOWN, 0X0D, 0); Win32.SendMessage(hwndsend, Win32.WM_KEYUP, 0X0D, 0); Win32.SendMessage(hwndsend, Win32.WM_CHAR, 0X0D, 0); } #endif textBox1.AppendText("---------------------------------------- \n"); textBox1.AppendText(DateTime.Now + ":"+ message + "\n"); } else { textBox1.AppendText("无法打开飞信短信发送窗口\n"); } _LastSend = DateTime.Now; LastSendTime = _LastSend; }

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧