static uint DOWN = 0x0002;
static uint UP = 0x0004;
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);
static void Click()
{
mouse_event(DOWN, 800, 800, 0, 0);
Thread.Sleep(100);
mouse_event(UP, 800, 800, 0, 0);
}为什么它不点击我的坐标800 800,它点击我的鼠标在哪里
发布于 2020-06-29 02:42:51
如果要单击指定的点而不是相对移动,则需要MOUSEEVENTF_ABSOLUTE标志。为了使从当前位置到目标位置的移动,需要MOUSEEVENTF_MOVE标志。
所以代码会是这样的:
static uint DOWN = 0x0002;
static uint UP = 0x0004;
static uint MOUSEEVENTF_ABSOLUTE = 0x8000;
static uint MOUSEEVENTF_MOVE = 0x0001;
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);
static void Click()
{
mouse_event(DOWN | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 800, 800, 0, 0);
Thread.Sleep(100);
mouse_event(UP | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 800, 800, 0, 0);
}并请注意:
如果指定了
MOUSEEVENTF_ABSOLUTE值,则dx和dy包含0和65,535之间的归一化绝对坐标。事件过程将这些坐标映射到显示面。将(0,0)映射坐标到显示面的左上角,(65535,65535)映射到右下角.
因此,如果要单击屏幕的指定像素,可以将绝对坐标转换为屏幕像素,如下所示:
static int SM_CXSCREEN = 0;
static int SM_CYSCREEN = 1;
[DllImport("user32.dll")]
static extern int GetSystemMetrics(int nIndex);
static void Click()
{
int sx = GetSystemMetrics(SM_CXSCREEN);
int sy = GetSystemMetrics(SM_CYSCREEN);
int x = 800 * 65536 / sx;
int y = 800 * 65536 / sy;
mouse_event(DOWN | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0);
Thread.Sleep(100);
mouse_event(UP | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0);
}mouse_event 函数已被取代。使用 代替.
https://stackoverflow.com/questions/62626388
复制相似问题