为什么模拟鼠标单击(使用mouse_event)只能在选定的组件上工作?

我有多个游标(这实际上是forms),可以由其各自的鼠标控制。 (1个用户为1个光标)。

我使用SetCursorPos将默认游标(原始系统游标)放置在不会从我的应用程序中ShowCursor(false)焦点的位置,并使用ShowCursor(false)来隐藏它。

我有一个类,获取鼠标的手柄和坐标 。

当用户点击时,我使用SetCursorPosmouse_event来模拟特定位置的点击。

我的模拟鼠标点击只适用于某些组件的OnClick事件(它应该只是button和标签,但是我试验了我的项目上的东西,只是为了知道什么会或不会工作):

它适用于:

  • button(TButton,TBitBtn,TAdvSmoothButton)
  • TAdvGrid
  • TMenuItem(但是TMainMenu的直接子)
  • TRadioButton

它不适用于:

  • 的TLabel
  • 面板(TPanel,TAdvSmoothPanel)
  • TCoolBar
  • TMenuItem(不是TMainMenu的直接子)

这是我的代码:

  SetCursorPos(currentX , currentY); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

为什么它不能在一些组件上工作? 有没有解决方法(因为我想能够使用mouse_event单击标签)。

编辑:我试着检查点击function是否真的叫,所以我把ShowMessage('clicked'); 在SetCursorPos和mouse_event之前……但奇怪的是一切(小编辑:除了MenuItems之外的所有东西)现在工作正常(除了我每次尝试点击某个东西时popup一个消息)。 有没有人有一个想法,为什么这样performance?

Solutions Collecting From Web of "为什么模拟鼠标单击(使用mouse_event)只能在选定的组件上工作?"

似乎在这里工作;

 procedure TForm1.Panel1Click(Sender: TObject); begin ShowMessage('Click'); end; procedure TForm1.Button1Click(Sender: TObject); var Pt: TPoint; begin Pt := Panel1.ClientToScreen(Point(0, 0)); SetCursorPos(Pt.x, Pt.y); // SetCursorPos(Panel1.ClientOrigin.x, Panel1.ClientOrigin.y); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end; 

或者没有SetCursorPos ;

 procedure TForm1.Button1Click(Sender: TObject); var Pt: TPoint; begin Pt := Panel1.ClientToScreen(Point(0, 0)); Pt.x := Round(((Pt.x + 1) * 65535) / Screen.Width); Pt.y := Round(((Pt.y + 1) * 65535) / Screen.Height); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0); end; 

mouse_event实际上是弃用的,你应该使用SendInput来代替,看看是否修复了任何东西(我也建议让鼠标移动一个输入消息,通过使用SetCursorPos),另外,如果你这样做了一个特定的应用程序, PostMessage可能是一个多更好更简单的替代方案

它现在意外工作,这些组件可能已经捕获了鼠标。 您需要在第二个和第三个参数中传递鼠标指针坐标。 从而:

  //SetCursorPos(currentX , currentY); mouse_event(MOUSEEVENTF_LEFTDOWN, currentX, currentY, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, currentX, currentY, 0, 0);