PostMessage API为WM_LBUTTONDOWN / UP处理错误的坐标

时间:2019-05-16 16:06:14

标签: c# winapi user32

我正在使用PostMessage api将点击事件发送到在虚拟桌面上打开的窗口(由CreateDesktop api创建)。

它工作正常,但是有一些窗口类型。

var clientPoint = new Point(100, 200);
var hWnd = WindowFromPoint(clientPoint);
ScreenToClient(hWnd, ref clientPoint);
PostMessage(hWnd, isDown ? 0x0201 : 0x0202, 0, MakeLParam(clientPoint.Y, clientPoint.X));

结果是:

image

那么,我应该如何发送clink事件以防止出现此问题? 由于虚拟桌面,我无法使用Cursor.Position

2 个答案:

答案 0 :(得分:0)

PostMessage发送到WM_LBUTTONDOWN的坐标是hWnd的客户坐标。

还有ScreenToClient

  

将屏幕上指定点的屏幕坐标转换为   客户区域坐标。

如果客户已经有了坐标,则不需要ScreenToClient

顺便说一句:

发送WM_LBUTTONDOWN消息时,lParam的低位字指定光标的X坐标,而高位字则指定光标的Y坐标。 MAKELPARAM的第一个参数是低位,第二个参数是高位,所以MAKELPARAM (X, Y)

对于单击“ 3D对象”:

var clientPoint = new Point(100, 200);
var hWnd = WindowFromPoint(clientPoint);//Recognize (100,200) as screen coordinate
ScreenToClient(hWnd, ref clientPoint);//Convert (100,200) to a client coordiante, such as (50,150).
PostMessage(hWnd, isDown ? 0x0201 : 0x0202, 0, MakeLParam(clientPoint.X, clientPoint.Y));

对于“音乐”:

var clientPoint = new Point(100, 200);//client coordinate
var point_to_window = new Point(x,x);//Recognize (x,x) as screen coordinate which is in the window you want.
var hWnd = WindowFromPoint(point_to_window);
//ScreenToClient(hWnd, ref clientPoint);
PostMessage(hWnd, isDown ? 0x0201 : 0x0202, 0, MakeLParam(clientPoint.X, clientPoint.Y));//Recognize (100,200) as client coordinate

答案 1 :(得分:-1)

我有个主意。 这不是正确的方法,而是有效的方法。 问题只发生在这种树视图上。 因此,它具有一个通用的类。

GetClassLong(hWnd, -32);

返回49504类代码。 我正在检查该点的句柄是否具有此类代码,然后使用屏幕坐标。如果不是,请使用客户坐标。

现在,我有一个非常强大的远程桌面应用程序,仅适用于单独的桌面:)谢谢。所有工作都为我完成。

对于那些不相信可能的人;只要相信,一切皆有可能。