#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;
}
АКСЕЛЕРАТОРЫ В МОДАЛЬНОМ ДИАЛОГЕ
Сделал главное окно диалоговым:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, MainWindowDlgProc);
return 0;
}
Где нужно прописать LoadAccelerators() и TranslateAccelerator(), чтобы акселераторы работали в диалоговом окне?
Ну уж если очень припёрло задействовать акселераторы то могу предложить такой вариант:
Тут, видимо, нужно ставить хук на клавиатуру, но я не умею.
Может кто научит?
Вот пример... Просто и понятно :-)))
ШпиЁн, ты - волшебник, все работает!
Хук - это сила!!!
Вопрос такой: WH_GETMESSAGE ловит все сообщения, идущие к окну? И не через хуки ли реализована PreTranslateMessage в MFC (по крайней мере CDialog::PreTranslateMessage)?
Где можно найти русскоязычную документацию на хуки? А то в 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.
В общем, перед подачей сообщения окну вначале оно подается нам на блюдечке. можно творить что угодно :-))))
Нашел неплохую доку по хукам (MSDN):
Но все-таки в 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.
Я думаю тема закрыта.