Нажмите кнопку из другого приложения, эмулируя мышь + координаты? - PullRequest
0 голосов
/ 25 мая 2011

Я пытался нажать на кнопку, используя следующее:

private const int BN_CLICK = 0xF5;
private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;
SendMessage(sendButton, BN_CLICK, IntPtr.Zero, IntPtr.Zero);
SendMessage(sendButton, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(sendButton, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

Все вышеперечисленное не смогло нажать кнопку, , поэтому я задавался вопросом о других альтернативах, которые у меня есть, или, если возможно,чтобы получить расположение кнопок X и Y из их обработчика ?

Предложения, идеи были бы действительно хорошими.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

После многих тестов с использованием sendmessage я решил попробовать PostMessage, который работал как чудо ...

PostMessage(mainControlChild, WM_KEYDOWN, (int)Keys.Return, 0);
PostMessage(mainControlChild, WM_KEYUP, (int)Keys.Return, 0);

Решил мою проблему и отправил ее на задний план.

1 голос
/ 25 мая 2011

Если у кнопки есть горячая клавиша (Alt + ...), вы можете использовать отправку сообщения о нажатии клавиш клавиатуры:

//Presses virtual key in active window.
void PressVK(UINT vk)
{
    //Down Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
    //Press key.
    keybd_event(vk, MapVirtualKey(vk, 0), 0, 0);
    keybd_event(vk, MapVirtualKey(vk, 0), KEYEVENTF_KEYUP, 0);
    //Up Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
}

Это код C ++.Но вы можете импортировать все эти функции в C # и использовать их.Все, что вам нужно: активируйте целевое окно и вызовите эту функцию с правильным ключом в качестве параметра.

Если у вас есть ручка кнопки, тогда вызовите GetWindowRect.Он вернет указатель на структуру RECT, которая получает экранные координаты левого верхнего и правого нижнего углов окна.Таким образом, вы сможете выполнять эмуляцию клика независимо от размера основного окна.

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

Используя его:

RECT rect;
if (!GetWindowRect(new HandleRef(this, this.Handle), out rect))
{
    //Error.
}
...