Можно ли через SendMessage отправить клик по координатам? - C#
Формулировка задачи:
Например, я знаю координаты элемента, в котором находятся кнопки, у которых нет хендла.
Поэтому можно ли нажать на 20 пикселей ниже позиции какого-нибудь элемента?
Вот, например, кнопка клик происходит по ней, а как можно кликнуть ниже на несколько пикселей?
int val = Convert.ToInt32("00380192", 16);
IntPtr handle = new IntPtr(val);
SendMessage(handle, (uint)WindowMessages.WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(handle, (uint)WindowMessages.WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);Решение задачи: «Можно ли через SendMessage отправить клик по координатам?»
textual
Листинг программы
public class ClickOnPointTool
{
[DllImport("user32.dll")]
static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint);
[DllImport("user32.dll")]
internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
#pragma warning disable 649
internal struct INPUT
{
public UInt32 Type;
public MOUSEKEYBDHARDWAREINPUT Data;
}
[StructLayout(LayoutKind.Explicit)]
internal struct MOUSEKEYBDHARDWAREINPUT
{
[FieldOffset(0)]
public MOUSEINPUT Mouse;
}
internal struct MOUSEINPUT
{
public Int32 X;
public Int32 Y;
public UInt32 MouseData;
public UInt32 Flags;
public UInt32 Time;
public IntPtr ExtraInfo;
}
#pragma warning restore 649
public static void ClickOnPoint(IntPtr wndHandle , Point clientPoint)
{
var oldPos = Cursor.Position;
/// get screen coordinates
ClientToScreen(wndHandle, ref clientPoint);
/// set cursor on coords, and press mouse
Cursor.Position = new Point(clientPoint.X, clientPoint.Y);
var inputMouseDown = new INPUT();
inputMouseDown.Type = 0; /// input type mouse
inputMouseDown.Data.Mouse.Flags = 0x0002; /// left button down
var inputMouseUp = new INPUT();
inputMouseUp.Type = 0; /// input type mouse
inputMouseUp.Data.Mouse.Flags = 0x0004; /// left button up
var inputs = new INPUT[] { inputMouseDown, inputMouseUp };
SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
/// return mouse
Cursor.Position = oldPos;
}
}
// ...
ClickOnPoint(this.Handle, new Point(375, 340));