微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WM_KEYDOWN-捕获引起事件的按键[重复]

如何解决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 举报,一经查实,本站将立刻删除。