Можно ли через 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));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы