如何解决WM_KEYDOWN-捕获引起事件的按键[重复]
|| 这个问题已经在这里有了答案:解决方法
有几种方法可以解决此问题。没有一个能给您“纳秒”的精度,但是在这里。
如果希望活动窗口或对话框接收按键,则即使在对话框/窗口的WINPROC中也可以处理WM_KEYDOWN。
void InSomePlace()
{
WNDCLASS wndClass
ZeroMemory( &wndClass,sizeof(wndClass) );
// Initialize wndClass members here
wndClass.lpszClassName = _T(\"MyWindow\");
wndClass.lpfnWndProc = &MyWndProcHandler; //
RegisterClass( &wndClass );
HWND hWnd = CreateWindow( _T(\"MyWindow\",/* lots of other parameters */ );
MSG msg;
BOOL bRet;
while ( (bRet = GetMessage( &msg,hWnd,0 )) != 0 )
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
LRESULT CALLBACK MyWndProcHandler( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
switch ( uMsg )
{
// Lots of case statements,in particular you want a WM_KEYDOWN case
case WM_KEYDOWN:
if ( wParam == \'S\' )
{
// Do something here
return 0L;
}
break;
}
return DefWindowProc( hwnd,uMsg,wParam,lParam );
}
对于非常相似的DialogBox,您仍然会有DLGPROC作为最后一个参数传递给DialogBox / CreateDialog
void InSomePlace( HINSTANCE hInstance,HWND hParentWindow )
{
DialogBox( hInstance,_T(\"MyDialogTemplate\"),hParentWindow,&MyDialogProc );
}
INT_PTR CALLBACK MyDialogProc( HWND hwndDlg,LPARAM lParam )
{
case ( uMsg )
{
// Lots of case statements,in particular you want a WM_KEYDOWN case
case WM_KEYDOWN:
if ( wParam == \'S\' )
{
// Do something here
SetWindowLong(hwndDlg,DWL_MSGRESULT,0L);
return TRUE;
}
break;
}
return FALSE;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。