Win32 SDK消息处理技巧

 Win32 SDK中利用 DialogBox/DialogBoxParam 创建模态对话框一般行为是不处理WM_KEYDOWN消息的。

 非要处理可以子类化控件
 HANDLE hedit=GetDlgItem(hMainWnd,IDC_EDIT1);
 (WNDPROC)SetWindowLong(hedit, GWL_WNDPROC,(LONG)EditSubProc);


如果该对话框中没有任何的子控件的话,在对话框的窗口回调函数DlgProc()中是可以过滤到WM_KEYDOWN消息的.

不过并不是所有的键的消息都可以捕获到,例如像Tab键,上下左右方向键VK_UP/VK_DOWN/VK_LEFT/VK_RIGHT等都没有办法捕获到。

如果该模态对话框中有子控件,哪怕是一个static静态文本控件的话,这个时候对话框的窗口回调函数中就无法获取任何的WM_KEYDOWN消息了。

所以模态对话框在没有任何子控件的情况下想要处理Tab键/VK_UP/Down/Left/Rigth键的话,可以使用下面的方式:

#include <windows.h>
#include <stdio.h>
#include "resource.h"

extern BOOL CALLBACK DialogProc(HWND hMainWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

 DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
 return 1;
}
BOOL CALLBACK DialogProc(HWND hMainWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 char str1[MAX_PATH]="";
 HWND hwndTemp=NULL;
 HMENU hMenu=NULL;
 switch(uMsg)
 {
 case WM_KEYDOWN:
  MessageBox(0,0,0,0);
  break;

 case WM_CLOSE:
  ExitProcess(0);

  break;
 case WM_INITDIALOG:
  HANDLE hedit=GetDlgItem(hMainWnd,IDC_EDIT1);
  (WNDPROC)SetWindowLong(hedit, GWL_WNDPROC,(LONG)EditSubProc);
  break;
 }
 return 0;
}
LRESULT CALLBACK EditSubProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 return 0;
}
//该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。
LRESULT CALLBACK NewDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
 switch(message)
 {
  // 注意这里,否则没有办法捕获Tab/方向键
 case WM_GETDLGCODE:
  return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam));
 case WM_KEYDOWN:
  TCHAR szText[MAX_PATH] = {0};
  SetWindowText(hWnd, szText);
  break;
 default:
  break;
  return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
 }
}

posted @ 2015-04-21 14:40  鑫鑫1  阅读(611)  评论(0编辑  收藏  举报