Fra*_*aar 6 mouse winapi windows-vista
我正在尝试将鼠标点击发送到程序.由于我不希望鼠标移动,我不想使用SendInput或mouse_event,因为应该接收点击的窗口并不真正使用按钮或其他GUI事件,我无法向这些发送消息纽扣.
我试图使用SendMessage使这个工作,但由于某种原因它不起作用.相关代码是(在C#中,但也尝试使用jnative的Java),在Vista上尝试这个
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage(IntPtr A_0, int A_1, int A_2, int A_3);
static int WM_CLOSE = 0x10;
static int WM_LBUTTONDOWN = 0x201;
static int WM_LBUTTONUP = 0x202;
public static void click(IntPtr hWnd, int x, int y)
{
SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10) ^ y));
SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10) ^ y));
}
public static void close(IntPtr hWnd)
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
该close精品工程,但click没有做任何事情.
编辑:发现问题.除了替换x和y坐标的愚蠢错误,如下所示,我没有检查接收点击的Window句柄是否也是正确的客户端窗口.我现在有
POINT p = new POINT(x, y);
IntPtr hWnd = WindowFromPoint(p);
RECT rct = new RECT();
if (!GetWindowRect(hWnd, ref rct))
{
return;
}
int newx = x - rct.Left;
int newy = y - rct.Top;
SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx);
SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx);
Run Code Online (Sandbox Code Playgroud)
哪作得很完美.
问题出在 x,y 坐标的包装上。
y应该是高位词你应该有以下内容
((y << 0x10) | x)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8378 次 |
| 最近记录: |