Уведомление при открытии диалога Windows - PullRequest
1 голос
/ 22 декабря 2009

Я хочу выполнить некоторую обработку при открытии определенного диалогового окна, но я не могу найти какой-либо способ получить уведомление, когда этот диалог открыт.

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

Единственная доступная информация о диалоге - это его название и его уникальность.

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Общим решением является использование оконных хуков, фильтрация по WH_CBT, фильтрация по WM_CREATE или что-то в этом роде, получение текста окна и проверка его на интерес.

Еще один важный момент: в хуке вы должны использовать SetWindowLongPtr (), чтобы установить в оконном процессе свою собственную функцию, которая фактически получит событие WM_CREATE. Во всех вызовах эта функция должна вызывать исходную оконную процедуру.

1 голос
/ 22 декабря 2009

Вы также можете использовать CBT Hook для просмотра сообщений о создании окон. У вас будет доступ к CREATSTRUCT, используемому для создания фактического окна, например, заголовка и имени класса. Вы можете предотвратить создание окна в вашем хуке, изменить размер и т. Д.

0 голосов
/ 22 декабря 2009

ОК, способ сделать это - использовать SetWindowsHookEx (WH_SYSMSGFILTER, ...) Вы получите намного больше обратных вызовов, чем вам действительно нужно. а глобальные перехваты - это реальное снижение производительности системы (они могут заставить систему сериализовать вещи, которые обычно работают независимо)

обязательно прочитайте замечания, особенно эту часть:

SetWindowsHookEx может использоваться для внедрения DLL в другой процесс. 32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс. Если приложение требует использования хуков в других процессах, требуется, чтобы 32-разрядное приложение вызывало SetWindowsHookEx для внедрения 32-разрядной DLL в 32-разрядные процессы, а 64-разрядное приложение вызывало SetWindowsHookEx для внедрения 64-разрядного DLL в 64-битных процессах. 32-битные и 64-битные библиотеки DLL должны иметь разные имена.

Ваш хук должен находиться в dll, и dll будет в конечном итоге загружен в адресное пространство другого процесса, так что у вас не будет доступа к адресному пространству ваших процессов, вам придется настроить какой-то тип межпроцессное взаимодействие между вашим хуком и вашим приложением.

В целом я бы сказал, что это звучит как очень плохая идея.

0 голосов
/ 22 декабря 2009

РЕДАКТИРОВАТЬ: извините, не заметил, что у вас нет кода, а только название. Поэтому я думаю, что вам нужно другое решение для постов

Обработка событий в приложениях win32 выполняется с помощью так называемой процедуры windows, которая является функцией обратного вызова со следующей сигнатурой:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

Этот обратный вызов вызывается окнами каждый раз, когда появляется сообщение для окон, которые зарегистрированы с помощью этой функции обратного вызова. Одним из первых сообщений, отправляемых в новое окно, является сообщение WM_CREATE.

Если вы создаете свои окна «вручную» с помощью win32 API, то должна быть статическая функция обратного вызова, подобная приведенной ниже, где вы можете фильтровать сообщения WM_CREATE.

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
  switch( message )
  {
    case WM_CREATE:
      // do what ever you want 
      return 0;

    case default:
      return DefWndProc( hwnd, message, wParam, lParam );

  }
}

Если вы используете диалоги MFC (CDialog), вы можете перезаписать функцию CDialog::OnInitDialog().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...