问题描述
||
这个问题已经在这里有了答案:
解决方法
有几种方法可以解决此问题。没有一个能给您“纳秒”的精度,但是在这里。
如果希望活动窗口或对话框接收按键,则即使在对话框/窗口的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;
}