2011-07-14 92 views
2

我有一个程序与触摸屏一起运行,但由于鼠标指针在触摸屏上出现问题,触摸屏的Windows鼠标行为已被禁用,正在使用自制程序来监视触摸屏并将信息发送到屏幕被触摸或未触摸的位置(即,WM_LBUTTONDOWN, WM_LBUTTONUP)的窗口。模拟Windows中的C++鼠标事件

相关的代码看起来是这样的:

touched = false; 

while (1) 
{ 
    if (!touched) { 
     // p.x and p.y calculated here based on mouse position at 
     // time of touch screen event 
     p.x = ...; 
     p.y = ...; 

     if ((window = WindowFromPoint (p)) != NULL) 
      PostMessage (window, WM_LBUTTONDOWN, 0, 0); 

     touched = true; 
    } 
    else 
    { 
     if ((window = WindowFromPoint (p)) != NULL) 
      PostMessage (window, WM_LBUTTONUP, 0, 0); 

     touched = false; 
    } 
} 

这工作,但并不完全模仿Windows的鼠标按行为 - 无论何时发生非触摸(触摸的位置,即如果触摸被拖动),WM_LBUTTONUP被发送到接收到WM_LBUTTONDOWN的控件。

我想要做的是让它更像Windows。在任何应用程序中,打开一个包含按钮的对话框。点击并按住按钮上的鼠标,你会看到它压低。将鼠标从按钮上拖出来,不要松开鼠标,然后你会看到按钮再次升起。将鼠标拖回到按钮上,您会看到它被压低。如果在指针位于按钮上时释放鼠标,则按下该按钮。如果在指针离开按钮时释放鼠标,则不会按下该按钮。

我设置了一个低级别的鼠标钩子,并且可以看到,这个序列期间发生的唯一鼠标事件是WM_LBUTTONDOWN后面紧跟着一个WM_LBUTTONUP,不管一系列WM_MOUSEMOVE鼠标是否被释放或关闭按钮。

我已经尝试添加替代处理的时候拖动鼠标,并发布WM_MOUSEMOVE消息,但哪些控件应该发送到? WM_LBUTTONDOWN事件最初发送到的按钮或其他位置?我已经尝试了按钮和窗口按钮,但显然我做了一些错误,因为它似乎没有工作。我已经能够实现的最好的功能是触摸屏按钮没有被“点击”,当我解开按钮时,但触摸屏按钮仍然被拉下。

有什么建议吗?

任何人都可以确认哪些事件应在此操作过程中发送?

感谢您的任何建议。

+0

你检查了这个问题:http://stackoverflow.com/questions/5164774/how-can-i-simulate-mouse-events-from-code – iammilind

+0

我已经尝试过SendInput,但问题是SendInput(除非我做错了什么)使鼠标指针作出反应,就好像我发送的鼠标事件实际发生了一样 - 所以如果我将鼠标发送到另一个位置,鼠标实际上会移动到另一个位置。我想要做的是将底层的WM_LBUTTONDOWN,WM_MOUSEMOVE和WM_LBUTTONUP消息(以及任何其他消息,如果有的话)发送到适当的控件,就好像鼠标实际上被点击和/或拖拽到那里一样,但而不用在那里移动鼠标指针。 – Mark

+0

如果您想要隐藏鼠标指针,最好的办法可能是将鼠标指针设置为不可见的指针。使用WM_消息而不是使用SendInput的问题是,如果目标应用程序使用GetCursorPos或Get [Async] KeyState来检查鼠标位置或按钮状态,它将获得实际状态,而不是您想要伪造的状态。 (另外,如果应用程序做了一些奇怪的事情,比如在钩子或消息循环中处理输入,而不是在窗口过程中,则当您发布消息时,它可能不起作用。)但是,如果您拥有此目标应用程序情况下,你可以计划。 – BrendanMcK

回答

0

这是你的代码:

PostMessage (window, WM_LBUTTONDOWN, 0, 0); 

你可以尝试,而不是上面的行这样的:

DWORD dw = MAKEWORD(p.x, p.y); 
    PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw); 

我觉得这个代码应工作。

+0

MAKEWORD从字节创建一个单词......您至少需要MAKELONG,尽管Windows鼠标按钮消息实际上采用LPARAM:http://stackoverflow.com/questions/8490389/wm-mousemove-packing-x-and-y-positions/8490518#8490518 – HostileFork