Как получить дескриптор кнопки стороннего приложения, используя c #? - PullRequest
3 голосов
/ 17 января 2011

Я пытаюсь создать событие нажатия в стороннем приложении. Для начала я попытался смоделировать щелчок в калькуляторе. Вот код "

IntPtr hwnd = IntPtr.Zero;
IntPtr hwndChild = IntPtr.Zero;
//Get a handle for the Calculator Application main window
hwnd = FindWindow(null, "Calculator");

hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "1");

//send BN_CLICKED message
SendMessage(hwndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero);

Но используя этот код, я не получаю ручку кнопки. Может ли кто-нибудь помочь, пожалуйста. Есть ли другой способ симулировать нажатие кнопки на стороннем приложении?

Спасибо.

Ответы [ 4 ]

1 голос
/ 17 января 2011

Он начал работать, когда я заменил

public const uint BM_CLICK = 0x00F5;

на

public const uint WM_LBUTTONDOWN = 0x0201; 
public const uint WM_LBUTTONUP = 0x0202;

и использовал

SendMessage(buttonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 
SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
1 голос
/ 17 января 2011

Ваш общий подход верен, но есть две потенциальные проблемы с вашим кодом:

  1. FindWindowEx находит только прямые дочерние элементы указанного окна.Возможно, кнопки калькулятора расположены в окне контейнера, которое является дочерним элементом основного окна, поэтому кнопка не будет прямым дочерним элементом основного окна.

  2. Документация для BM_CLICK гласит, что он имитирует щелчок, посылая сообщения мыши вверх и вниз, и, следовательно, вам может потребоваться активировать родительское окно перед отправкой этого сообщения.

0 голосов
/ 17 января 2011

Если у вас нет ручки кнопки, вы можете эмулировать щелчок мышью по координатам:

class User32
 { 
    [Flags]
    public enum MouseEventFlags
    {
        LEFTDOWN = 0x00000002,
        LEFTUP = 0x00000004,
        MIDDLEDOWN = 0x00000020,
        MIDDLEUP = 0x00000040,
        MOVE = 0x00000001,
        ABSOLUTE = 0x00008000,
        RIGHTDOWN = 0x00000008,
        RIGHTUP = 0x00000010
    }

    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int X, int Y);

    [DllImport("user32.dll")]
    public static extern void mouse_event(uint dwFlags, 
                                   uint dx, 
                                   uint dy, 
                                   uint dwData,
                                   int dwExtraInfo);

    [DllImport("user32.dll")]
    public static extern void mouse_event(uint dwFlags, 
                                   uint dx, 
                                   uint dy, 
                                   uint dwData,
                                   UIntPtr dwExtraInfo);
}

class Program
{
     static void Main()
     {
         User32.SetCursorPos(25, 153);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTDOWN, 25, 153, 0, 0);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTUP, 25, 153, 0, 0);
     }
}

Но, функция SetCursorPos устанавливает позицию курсора в глобальных координатах экрана, поэтому сначала вы должны получитьвозможность окна стороннего приложения.

0 голосов
/ 17 января 2011

Сначала используйте SPY ++, чтобы найти кнопку с ручкой.

В некоторых случаях элементы управления, похожие на Button, могут быть графическими элементами управления. Разница в том, что графический элемент управления не будет иметь дескриптора, но элемент управления Windows будет иметь дескриптор. Если этот элемент управления имеет действительный Handle.Then использовать FindWindowEx

Также задайте дескриптор родительского окна (я думаю, что первый параметр, может быть, вам придется использовать GetWindow () с подписью)

Затем отправьте сообщение о клике.

...