0
Click
不工作 - 我不知道爲什麼,不能找到一個解決辦法:(點擊指定的客戶端區域
即Click(150,215)
應該移動鼠標到客戶端區域,然後單擊有
[DllImport("user32.dll")]
private static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint);
[DllImport("user32", SetLastError = true)]
private static extern int SetCursorPos(int x, int y);
static void MouseMove(int x, int y)
{
Point p = new Point(x * -1, y * -1);
ScreenToClient(hWnd, ref p);
p = new Point(p.X * -1, p.Y * -1);
SetCursorPos(p.X, p.Y);
}
static void Click(int x, int y)
{
MouseMove(x, y);
SendMessage(hWnd, WM_LBUTTONDOWN, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
SendMessage(hWnd, WM_LBUTTONUP, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
}
編輯: 以下方法工作,但 「更先進」 我會說
。我當然可以使用mouse_event
對於這一點,但我想看到的SendMessage()的解決方案......
[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
const int LEFTDOWN = 0x00000002;
const int LEFTUP = 0x00000004;
static void Click(int x, int y)
{
MouseMove(x, y);
mouse_event((int)(LEFTDOWN), 0, 0, 0, 0);
mouse_event((int)(LEFTUP), 0, 0, 0, 0);
}
過了一會兒,我發現MouseInput
另一種方法通過SendInput
,但它是很長的: P
它可以縮小?
[Flags]
enum MouseEventFlags : uint
{
MOUSEEVENTF_MOVE = 0x0001,
MOUSEEVENTF_LEFTDOWN = 0x0002,
MOUSEEVENTF_LEFTUP = 0x0004,
MOUSEEVENTF_RIGHTDOWN = 0x0008,
MOUSEEVENTF_RIGHTUP = 0x0010,
MOUSEEVENTF_MIDDLEDOWN = 0x0020,
MOUSEEVENTF_MIDDLEUP = 0x0040,
MOUSEEVENTF_XDOWN = 0x0080,
MOUSEEVENTF_XUP = 0x0100,
MOUSEEVENTF_WHEEL = 0x0800,
MOUSEEVENTF_VIRTUALDESK = 0x4000,
MOUSEEVENTF_ABSOLUTE = 0x8000
}
[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
[StructLayout(LayoutKind.Explicit)]
struct MouseKeybdhardwareInputUnion
{
[FieldOffset(0)]
public MouseInputData mi;
}
struct MouseInputData
{
public int dx;
public int dy;
public uint mouseData;
public MouseEventFlags dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public SendInputEventType type;
public MouseKeybdhardwareInputUnion mkhi;
}
enum SendInputEventType : int
{
InputMouse,
}
static void Click(int x, int y)
{
INPUT mouseInput = new INPUT();
mouseInput.type = SendInputEventType.InputMouse;
mouseInput.mkhi.mi.dx = x;
mouseInput.mkhi.mi.dy = y;
mouseInput.mkhi.mi.mouseData = 0;
MouseMove(x, y);
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
}
謝謝,我已經有mouse_event方法。你覺得'SendInput'比簡單的'SendMessage'更好嗎(性能,速度)? – VixinG
看看我的編輯請告訴我,如果它可以以某種方式收縮:) – VixinG
發送'WM_LBUTTONDOWN'到任何你不擁有的窗口看起來像它會容易出錯。我找不到任何實際的文檔建議以這種方式使用'WM_LBUTTONDOWN',並且我確實知道'mouse_event'和'SendInput'是支持的方式。如果您擔心此類電話的表現,則必須對其進行基準測試。雖然'SendInput'是詳細的,大部分是P/Invoke簽名。 – Mitch