我正在使用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));
结果是:
那么,我应该如何发送clink事件以防止出现此问题?
由于虚拟桌面,我无法使用Cursor.Position
。
答案 0 :(得分:0)
从PostMessage
发送到WM_LBUTTONDOWN
的坐标是hWnd
的客户坐标。
将屏幕上指定点的屏幕坐标转换为 客户区域坐标。
如果客户已经有了坐标,则不需要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类代码。 我正在检查该点的句柄是否具有此类代码,然后使用屏幕坐标。如果不是,请使用客户坐标。
现在,我有一个非常强大的远程桌面应用程序,仅适用于单独的桌面:)谢谢。所有工作都为我完成。
对于那些不相信可能的人;只要相信,一切皆有可能。