Получение дескриптора кнопки из другого приложения
У меня есть программа, которая должна отправить сообщение BM_CLICK на другую кнопку приложений. Я могу получить Родительский дескриптор окна, но когда я пытаюсь получить дескриптор кнопки, если всегда возвращает 0
Я получил имя заголовка кнопки и тип кнопки от Spy++ это кажется правильным, но я знаю, что, должно быть, что-то не так. ниже приведен мой код
public const Int BM_CLICK = 0x00F5;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
private void button1_Click(object sender, EventArgs e)
{
Process[] processes = Process.GetProcessesByName("QSXer");
foreach (Process p in processes)
{
////the Button's Caption is "Send" and it is a "Button".
IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", "Send");
//ButtonHandle is always zero thats where I think the problem is
SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
}
шпионский снимок экрана
4 ответов
попробуйте передать null для текста окна и вместо этого попробуйте найти любую кнопку:
IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", null);
после этого вы можете использовать второй параметр и новый вызов, чтобы получить следующую кнопку обрабатывать пару раз.
также не могли бы вы, пожалуйста, попробуйте проверить Marshal.GetLastWin32Error
чтобы увидеть, что результат ошибки?
вы можете сделать что-то вроде этого:
//Program finds a window and looks for button in window and clicks it
HWND buttonHandle = 0;
BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
char label[100];
int size = GetWindowTextA(handle, label, sizeof(label));
if (strcmp(label, "Send") == 0) // your button name
{
buttonHandle = handle;
cout << "button id is: " << handle << endl;
return false;
}
return true;
}
int main()
{
HWND windowHandle = FindWindowA(NULL, "**Your Window Name**");
if (windowHandle == NULL)
{
cout << "app isn't open." << endl;
}
else
{
cout << "app is open :) " << endl;
cout << "ID is: " << windowHandle << endl;
SetForegroundWindow(windowHandle);
BOOL ret = EnumChildWindows(windowHandle, GetButtonHandle, 0); //find the button
cout << buttonHandle << endl;
if (buttonHandle != 0)
{
LRESULT res = SendMessage(buttonHandle, BM_CLICK, 0, 0);
}
}
}
это должно сделать трюк.