Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

АКСЕЛЕРАТОРЫ В МОДАЛЬНОМ ДИАЛОГЕ

8.4K
23 августа 2006 года
Sir
52 / / 28.07.2006
Подскажите, пожалуйста, как решить следующую проблему.

Сделал главное окно диалоговым:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, MainWindowDlgProc);
return 0;
}

Где нужно прописать LoadAccelerators() и TranslateAccelerator(), чтобы акселераторы работали в диалоговом окне?
1.8K
23 августа 2006 года
k3Eahn
365 / / 19.12.2005
Ну уж если очень припёрло задействовать акселераторы то могу предложить такой вариант:
Код:
#include "resource.h"
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
HACCEL hAxl;
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 
 hAxl=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR));
 DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,DlgProc,0);
 return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 static MSG msg;
 switch(uMsg)
 {
  case WM_INITDIALOG:
  {
   msg.hwnd=hDlg;
   return FALSE;
  };
  case WM_KEYDOWN:
  case WM_SYSKEYDOWN:
  {
   msg.lParam=lParam;
   msg.message=uMsg;
   msg.wParam=wParam;
   TranslateAccelerator(hDlg,hAxl,&msg);
   return FALSE;
  };
 
  case WM_COMMAND:
  {
   switch(LOWORD(wParam))
   {
    case IDM_HELLO:
    {
     MessageBox(hDlg,"You were looking at me I was looking at you\n"\
         "Coo Coo Ca Choo\n"\
         "Now whaddya gonna do?",
         "Blah...",MB_ICONINFORMATION);
     return FALSE;
    };
   };
   return FALSE;
  };
  case WM_CLOSE:
  {
   EndDialog(hDlg,0);
   return FALSE;
  };
 };
 return FALSE;
 
}

ЗЫ: акселератор повешен на элемент меню IDM_HELLO.
8.4K
25 августа 2006 года
Sir
52 / / 28.07.2006
Вариант не плохой, но он работает, если в диалоге нет контролов. Если есть, например, кнопка, то все WM_KEYDOWN и WM_SYSKEYDOWN идут ей, а не диалоговому окну.

Тут, видимо, нужно ставить хук на клавиатуру, но я не умею.
Может кто научит?
354
25 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Вот пример... Просто и понятно :-)))
8.4K
26 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=ШпиЁн]Вот пример... Просто и понятно :-)))[/QUOTE]

ШпиЁн, ты - волшебник, все работает!
Хук - это сила!!!

Вопрос такой: WH_GETMESSAGE ловит все сообщения, идущие к окну? И не через хуки ли реализована PreTranslateMessage в MFC (по крайней мере CDialog::PreTranslateMessage)?

Где можно найти русскоязычную документацию на хуки? А то в MSDN немного сложно они описываются :)
354
26 августа 2006 года
ШпиЁн
468 / / 19.02.2006
В MSDN довольно понятно написано, но не всё. там раскрываются основные принципы, не более. Например, хук на клавиатурный ввод поставить можно легко, а вот WH_CBT почему-то часто вызывает проблемы, если он глобальный. Подобной документации в интернете навалом, но она тоже неполная(примеров нету!). советую просто прочитать вдумчиво msdn и что неясно спросить вначале у поисковика, а если он молчит - тогда на форумах :-)))))

Насчет WH_GETMESSAGE. Вот что говорит по этому повoду msdn:
Цитата:
The system calls GetMsgProc function whenever the GetMessage or PeekMessage function has retrieved a message from an application message queue. Before returning the retrieved message to the caller, the system passes the message to the hook procedure.



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

8.4K
26 августа 2006 года
Sir
52 / / 28.07.2006
Нашел неплохую доку по хукам (MSDN):
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/dnwui/html/msdn_hooks32.htm

а вот и перевод:
http://www.rsdn.ru/article/baseserv/winhooks.xml
8.4K
26 августа 2006 года
Sir
52 / / 28.07.2006
ШпиЁн, спасибо.

Но все-таки в LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)

вместо
CallNextHookEx(hHook, code, wParam, lParam);
return false;

я сделал немного по-другому:
return CallNextHookEx(hHook, code, wParam, lParam);

т.к. в MSDN:

Return Value

If code is greater than or equal to zero, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_GETMESSAGE hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure does not call CallNextHookEx, the return value should be zero.

Я думаю тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог