Win32创建的对话框不同于CreateWindowEx创建的窗体对象,不能够通过WM_KEYDOWN来获取键盘的点击事件。经过一天的摸索,终于找到了一个可行的方案,感谢下面这个帖子的提示 http://book.21www.cn/info/vc_mfc/base/269.html

回答:3
这个问题似乎不好解决,微软的建议是: 1.用一个 WH_MSGFILTER钩子,在钩子函数里调用TranslateAccelerator 2.用非模式对话框,在主消息循环里调用TranslateAccelerator(做为主窗口,模式和非模式对话框效果是一样的)参见 http://support.microsoft.com/default.aspx?scid=kb;en-us;108936

打开后面这个提供的MSDN发现里面讲到的是使用MFC来实现的,但是我的程序没有用到MFC,也不打算使用MFC,而是使用C-Free创建的工程。所以准备仔细的研究里面的实现方式。总结如下:

首先要创建菜单

IDR_MENU1 MENU
BEGIN
POPUP "File"
BEGIN
MENUITEM "New\tCtrl + N",IDM_FILE_NEW
MENUITEM "Open...\tCtrl + O",IDM_FILE_OPEN
MENUITEM "Save\tCtrl + S",IDM_FILE_SAVE
MENUITEM "Save As...\tCtrl + Shirt + S",IDM_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "Page Setup...",IDM_FILE_PAGESETUP
MENUITEM "Print...\tCtrl + P",IDM_FILE_PRINT
MENUITEM SEPARATOR
MENUITEM "Exit",IDM_EXIT
END

创建加速器

IDR_ACCEL1 ACCELERATORS
BEGIN
78,IDM_FILE_NEW,VIRTKEY,CONTROL,NOINVERT
79,IDM_FILE_OPEN,VIRTKEY,CONTROL,NOINVERT
83,IDM_FILE_SAVE,VIRTKEY,CONTROL,NOINVERT
80,IDM_FILE_PRINT,VIRTKEY,CONTROL,NOINVERT
88,IDM_EDIT_CUT,VIRTKEY,CONTROL,NOINVERT
67,IDM_EDIT_COPY,VIRTKEY,CONTROL,NOINVERT
86,IDM_EDIT_PASTE,VIRTKEY,CONTROL,NOINVERT

里面的数字表示的是按键的ASCII码,比如78是"N”这个字符

接着在对话框的初始化函数里面

HACCEL hAccel;

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) {
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);

//Load icon
HICON hIcon = LoadIcon(hInstance ,MAKEINTRESOURCE(IDI_ICONAPP));
SendMessage(hwnd, WM_SETICON, TRUE, (LPARAM)hIcon);

//Init Accelerator
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));

//Create Windows Hook
SetWindowsHookEx(WH_MSGFILTER, AcceleratorHookProc, hInstance, 0);

下面是Windows消息钩子的处理函数

LRESULT CALLBACK AcceleratorHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
//MSG* lpMsg = (MSG*)lParam;
MSG msg ;
while (GetMessage (&msg, NULL, 0, 0)) {
if(!TranslateAccelerator(hwnd, hAccel, &msg) ) {
// Translate virtual-key messages into character messages
TranslateMessage(&msg);
// Send message to WindowProcedure
DispatchMessage(&msg);
}
}
return msg.wParam;
}

好了,设置结束,按照上述方法试试窗体是否可以响应按键了呢?