这是Win32 Application向导生成的一段About对话框的代码,我添加了WM_KEYDOWN消息
的处理。但是WM_KEYDOWN不响应
如果是MFC的话很好办,只要处理PreTranslateMessage就足够了,但Win32SDK很难
我知道似乎跟WM_GETDLGCODE有关,但不知道如何处理,希望袁峰大侠帮忙。LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
case WM_KEYDOWN:
{
int a=0;
}
break;
}
return FALSE;
}
的处理。但是WM_KEYDOWN不响应
如果是MFC的话很好办,只要处理PreTranslateMessage就足够了,但Win32SDK很难
我知道似乎跟WM_GETDLGCODE有关,但不知道如何处理,希望袁峰大侠帮忙。LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
case WM_KEYDOWN:
{
int a=0;
}
break;
}
return FALSE;
}
因为在消息循环里无论哪个窗口的消息都会被得到的.
所以我认为用PreTranslateMessage是极其消极的做法.
如果嫌分少我可以再加一些
SetFocus(hDlg);
return FALSE;
case WM_SETFOCUS:
return TRUE;
case WM_KEYDOWN:
MessageBox(hDlg, "", "", MB_OK);
return TRUE;
我不知你想处理对话框中的keydown是为了什么,普通情况下对话框上子控件肯定不会少的,难道你想对每个子控件进行子类化并当子控件获得WM_SETFOCUS时把焦点设回对话框?
case WM_INITDIALOG:
SetFocus(hDlg);
return FALSE;
case WM_SETFOCUS:
return TRUE;
case WM_KEYDOWN:
MessageBox(hDlg, "", "", MB_OK);
return TRUE;
它可以拦截按键消息
if( HIWORD(wParam) == BN_SETFOCUS )
{
BOOL bSwapButton = GetSystemMetrics(SM_SWAPBUTTON);
if( !bSwapButton && GetAsyncKeyState(VK_LBUTTON) < 0 ||
bSwapButton && GetAsyncKeyState(VK_RBUTTON) < 0)
{
SetTimer(hDlg, 1, 100, NULL);
}
else
{
SetFocus(hDlg);
}
return TRUE;
}
.....case WM_TIMER:
{
BOOL bSwapButton = GetSystemMetrics(SM_SWAPBUTTON);
if( !bSwapButton && GetAsyncKeyState(VK_LBUTTON) >= 0 ||
bSwapButton && GetAsyncKeyState(VK_RBUTTON) >= 0)
{
KillTimer(hDlg, 1);
SetFocus(hDlg);
}
return TRUE;
}
如果有更好的方法,我想MS官方不会推荐用安装钩子这样的方法.
我真是满笨的
处理消息不是对话框的强项,不灵活,不管怎样做也都很不爽,因为好多的消息都被过滤掉了
直接用HWND处理消息就好多了,我错误的做法是使用对话框作为主窗口,这样无形中给自己添了很多很多麻烦,最后想到,还是就使用HWND作为主窗口,通过CreateWindow,效果好的要命,呵呵感谢各位的发言,今天通过你们的见解和我的调试,对于Win32 SDK编程又熟悉了很多。我想一天的调试还是非常值得的