Программно нажмите кнопку в другом приложении (C, Windows) - PullRequest
18 голосов
/ 03 августа 2009

Я пытаюсь использовать следующий код для нажатия кнопки в моем другом приложении:

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
   ButtonHandle = FindWindowEx(wnd, 0, "SaveButton", "&Save");
   SendMessage(wnd, WM_COMMAND, MAKEWORD(GetDlgCtrlID(ButtonHandle), BN_CLICKED ), (LPARAM)ButtonHandle);

}

Это не работает. Я попытался передать разные дескрипторы в MAKEWORD и изменить WPARM и LPARAM, но ничего.

Есть идеи о том, как нажать кнопку в окне другого приложения?

Код приветствуется. Спасибо.

EDIT: Причина, по-видимому, не работает разрешения. Я отправил PostMessage (), и результатом стала ошибка с GetLastError () = 5 (или Access Denied). Есть идеи?

РЕДАКТИРОВАТЬ2 Я не хочу быть грубым, но, пожалуйста, пожалуйста, пожалуйста, я уже искал все API, включая получение и настройку областей для кнопки, а затем отправил кнопку вниз и кнопку вверх, получив контроль ID, получение ID класса и еще миллион. Причина, по которой я задал вопрос здесь, в первую очередь потому, что я уже исчерпал свой поиск в Интернете. Если вы знаете ответ ПОЖАЛУЙСТА, ПОСТ-КОД , не предлагайте API и все, покажите мне, как этот API решает проблему. Это не трудно. благодарю вас.

РЕДАКТИРОВАТЬ 3: Ответ на вопрос был выбран автоматически, когда награда закончилась. Вопрос до сих пор остается без ответа.

Ответы [ 11 ]

0 голосов
/ 16 сентября 2009

Вы можете использовать sendkeys (как сказал tr3) для отправки щелчков мыши, что отличается от использования SendMessage. Он также менее прямой и более хакерский, но полезен для автоматизации (в VBS).

Кроме того, только предположение, но проблема может заключаться в том, что ваша обработка сообщений где-то прерывается из-за отсутствия вызова члена базового класса. Пример:

void CMyClass::OnMessageY(CWnd *cwnd)
{
    CBaseClass::OnMessageY(cwnd);
    //... my code
}
...