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;
}