win32下,如何截获编辑框控件消息WM_KEYDOWN

right159 2012-05-18 09:00:44
void KeyChange( MSG msg )
{
switch( LOWORD(msg.wParam) )
{
case VK_DOWN:
SendMessage( msg.hwnd, EM_REPLACESEL, 0, (LPARAM)L"↓" );
break;
case VK_UP:
SendMessage( msg.hwnd, EM_REPLACESEL, 0, (LPARAM)L"↑" );
break;
case VK_LEFT:
SendMessage( msg.hwnd, EM_REPLACESEL, 0, (LPARAM)L"←" );
break;
case VK_RIGHT:
SendMessage( msg.hwnd, EM_REPLACESEL, 0, (LPARAM)L"→" );
break;
case VK_SPACE:
SendMessage( msg.hwnd, EM_REPLACESEL, 0, (LPARAM)L"〓" );
break;
}
}
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if( msg.message == WM_KEYDOWN )
{
if( GetParent( GetParent( msg.hwnd ) ) ) //判断是否为控件窗口
{
KeyChange( msg );
}
}
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

我想让对话框上的编辑框能响应方向键, 我是这样做的,在主消息循环里先判断WM_KEYDONW再判断控件窗口句柄然后发送消息替代原来编辑框文本内容,但没反映,难道对话框消息不是先从主消息循环这里开始的?


class CDialog
{
public:

CDialog();
static bool InitDialog( HWND hDlg, int *KeyValue );
static bool DefSet( HWND hDlg );
static bool FlishSet( HWND hDlg, LPTSTR UserName, int *KeyValue );

static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

static bool SetLimitText(HWND ChWnd, UINT nMax)
{
if( !IsWindow(ChWnd))
{
return false;
}
::SendMessage(ChWnd, EM_SETLIMITTEXT, nMax, 0);
return true;
}

void CreateDlg( int id, HWND hWnd )
{
DialogBox( hInst, MAKEINTRESOURCE(id), hWnd, (DLGPROC)About);
}
}; 另外,对话框窗口过程我写在类里面的。
...全文
653 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
right159 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

可以先用GetDlgItem获取edit的句柄,用SetWindowLong(edit句柄,GWL_WNDPROC,pNewWndproc)改变原edit的消息回调函数WndProc,具体见MSDN,或百度
[/Quote]

哦,你们的意思是要重新写个编辑框的窗口过程?。额,我不想那么麻烦,直接获取对应消息然后处理不行吗?
swent 2012-05-18
  • 打赏
  • 举报
回复
可以先用GetDlgItem获取edit的句柄,用SetWindowLong(edit句柄,GWL_WNDPROC,pNewWndproc)改变原edit的消息回调函数WndProc,具体见MSDN,或百度
right159 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

就是用你的窗口过程代替原来的窗口过程参考:SetWindowLong
[/Quote]

void CreateDlg( int id, HWND hWnd )
{
DialogBox( hInst, MAKEINTRESOURCE(id), hWnd, (DLGPROC)About);
}
对话框创建的不就是原来的吗? 一直都是about。如何代替?
schlafenhamster 2012-05-18
  • 打赏
  • 举报
回复
就是用你的窗口过程代替原来的窗口过程参考:SetWindowLong
right159 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

子类化Edit
[/Quote]

有没有具体的做法?,子类化不是太明白。
right159 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

楼主,我不是很明白你说的“发送消息替代原来编辑框文本内容”和“对话框窗口过程写在类里面”,你建立的是普通的win32还是MFC的,如果是普通的win32,那它的窗口过程应该是在注册窗口类的时候确定的
[/Quote]

建立的是win32, 注册的时候是确定,实现可以写在类里面的,现在就是想截获Edit控件的WM_KEYDOWN消息中的VK_方向键.. 就是说我在编辑框控件上按↑,编辑框文本内容上就会有↑ (原来编辑框不识别方向键)。
schlafenhamster 2012-05-18
  • 打赏
  • 举报
回复
子类化Edit
iytbihc 2012-05-18
  • 打赏
  • 举报
回复
楼主,我不是很明白你说的“发送消息替代原来编辑框文本内容”和“对话框窗口过程写在类里面”,你建立的是普通的win32还是MFC的,如果是普通的win32,那它的窗口过程应该是在注册窗口类的时候确定的
right159 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C/C++ code
WNDPROC OldWndProc = NULL;

LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
{
Messa……
[/Quote]
直接在while (GetMessage(&msg, NULL, 0, 0))
{
if( msg.message == WM_KEYDOWN )
{
if( GetParent( GetParent( msg.hwnd ) ) ) //判断是否为控件窗口
{
KeyChange( msg );
}
}
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
弄到消息再处理不行吗?
Eleven 2012-05-18
  • 打赏
  • 举报
回复
WNDPROC OldWndProc = NULL;

LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
{
MessageBox(hWnd, _T("XX"), NULL, 0);
}
break;

default:
break;
}
return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT1);
if(hEdit)
{
OldWndProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)NewWndProc);
}
}
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧