Win32 SDK消息处理技巧
2015-04-21 14:40
197 查看
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);
}
}
非要处理可以子类化控件
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);
}
}
相关文章推荐
- Win32 SDK开发中对话框控件消息处理
- Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
- Win32 SDK基础(10)—— 几种常见的Windows消息处理
- Win32 SDK基础(12)—— WM_PAINT消息的处理
- Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
- 【VC编程】笔记3---使用Win32SDK编程,模仿MFC的消息映射处理机制
- Win32消息处理API---PostMessage【转】
- Win32编程中如何处理控制台消息
- 安卓开发中,在低版本SDK使用高版本的API会报错。一般处理方法是换一种实现方法,或者在高版本SDK中使用高版本API,低版本SDK中使用效果可能会差点的折衷方案;后者可以用如下技巧来实现。
- 【JAVA微信开发】WxMessageSDK-轻量的微信公众号消息处理SDK
- 一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数
- CB非可视组件的消息处理技巧
- Win32消息处理API---PostMessage
- Win32消息处理API---BroadcastSystemMessage、BroadcastSystemMessageEx
- win32控件消息处理
- Win32编程中如何处理控制台消息
- SDK对消息的处理过程和MFC消息映射及MFC中类产的对象与窗口
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- [ATL/WTL]_[初级]_[Win32实现Cocoa的dispatch_async到主线程的异步消息处理]
- 一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数