使用SDK开发的对话框如何捕捉WM_KEYDOWN 我知道如果是用MFC开发的对话框可以用 PreTranslateAccelerator,但是我现在是用 SDK 开发的对话框,那该怎么办呢?我主要是想捕捉 Escape 和 Ctrl+Enter 等键。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要捕获对话框的按键消息,必须先子类化该对话框。即用 SetWindowLong 函数改变对话框的处理过程,并在自己的过程中处理按键消息:) 说得好复杂哦。直接在对话框的DialogProc()中处理不行吗?就像主窗口的WndProc()中一样switch(){ case WM_KEYDOWN: // 虚拟键 // 组合键用GetKeyState()} 简单啊,消息处理函数中添加case WM_KEYDOWN: if ((int)wParam == VK_ESCAPE) ...//esc Pressed if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN) ...//Ctrl+enter Pressed break; 直接处理是不行的,请大家自己试验一下。WM_KEYDOWN 消息似乎根本没有送过来,所以没法处理。如果直接处理可以我就不会来这里问了。 直接处理不行那么case WM_SYSKEYDOWN:这个可以吗, LONG SetWindowLong(HWND hWnd, GWL_WNDPROC, MyProc);在MyProc中处理消息。 这个问题并不是用SDK或MFC的问题,子控件有自己默认的消息处理函数所以一部分消息是不会交给父窗口处理的。LRESULT CALLBACK MyProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam){ if (uMsg == WM_KEYDOWN) { if ((int)wParam == VK_ESCAPE) ...//esc Pressed if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN) ...//Ctrl+enter Pressed } return CallWindowProc(OldProc,hwnd, uMsg,wParam,lParam); } 唉,给个范例给你吧:WNDPROC lpfnOldDlgProc = NULL;LRESULT CALLBACK NewDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);...DlgProc(HWND hDlg,... // 对话框处理过程中... case WM_INITDIALOG: lpfnOldDlgProc = (WNDPROC)SetWindowLong(hDlg,GWL_WNDPROC,(LONG)NewDlgProc);...//LRESULT CALLBACK NewDlgProc(HWND hWnd,... // 新的处理过程{ switch(uMsg) { case WM_KEYDOWN: // 在这里处理你的按键消息 break; default: break; } return CallWindowProc(lpfnOldDlgProc,hWnd,uMsg,wParam,lParam);} 我在网上找到解决的办法了:http://blogs.msdn.com/oldnewthing/archive/2005/04/07/406012.aspx 大家用VS2010会很卡吗?? 请教IHTMLLinkElement接口传递的问题 关于wav头文件的问题,up有分,希望高手来解答。 请问用VC++编一个中国象棋游戏程序需要哪些知识? 关于网络打印的问题 TDI接口(VxD)可以用在Win98中吗? 请问在单文档中如何保存图形文件? 多文档中“打开”文件对话框的疑问. 哪位大神知道firefox的Base64相关函数定义在哪个dll文件下? Visual C++.NET 我接下来学点什么好呢,各位大侠和过来人帮我指导指导, JPEG文件最大可以是多大?
即用 SetWindowLong 函数改变对话框的处理过程,并在自己的过程中处理按键消息:)
switch()
{
case WM_KEYDOWN:
// 虚拟键
// 组合键用GetKeyState()
}
case WM_KEYDOWN:
if ((int)wParam == VK_ESCAPE)
...//esc Pressed
if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN)
...//Ctrl+enter Pressed
break;
如果直接处理可以我就不会来这里问了。
那么
case WM_SYSKEYDOWN:这个可以吗,
在MyProc中处理消息。
{
if (uMsg == WM_KEYDOWN)
{
if ((int)wParam == VK_ESCAPE)
...//esc Pressed
if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN)
...//Ctrl+enter Pressed
}
return CallWindowProc(OldProc,hwnd, uMsg,wParam,lParam);
}
WNDPROC lpfnOldDlgProc = NULL;
LRESULT CALLBACK NewDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);...DlgProc(HWND hDlg,... // 对话框处理过程中
.
.
.
case WM_INITDIALOG:
lpfnOldDlgProc = (WNDPROC)SetWindowLong(hDlg,GWL_WNDPROC,(LONG)NewDlgProc);
.
.
.//LRESULT CALLBACK NewDlgProc(HWND hWnd,... // 新的处理过程
{
switch(uMsg)
{
case WM_KEYDOWN:
// 在这里处理你的按键消息
break;
default:
break;
}
return CallWindowProc(lpfnOldDlgProc,hWnd,uMsg,wParam,lParam);
}
http://blogs.msdn.com/oldnewthing/archive/2005/04/07/406012.aspx