我在一个对话框中添加了一个Edit控件,这个Edit控件我定制了OnChar和OnKeyDown两个函数,然后在对话框程序里建立了一个键盘钩子,想法是当按下一个字符时,先在钩子里面对参数进行修改,让文本框里面不论按下什么都输入同一个字符,但是现在发现不起作用,代码如下:对话框里的钩子创建
LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
{
if ( code < 0 )
return CallNextHookEx( NULL, code, wParam, lParam );
return CallNextHookEx( NULL, code, 51, 262145 );//数字3
}void Cdel3Dlg::OnBnClickedOk()
{
m_TempHook = SetWindowsHookEx( WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId());}Edit控件我定制了一下:
void MyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
WCHAR buff[MAX_PATH] = {0};
_snwprintf( buff, MAX_PATH, L"OnChar: %d", nChar ); CEdit::OnChar( nChar, nRepCnt, nFlags );
}void MyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
WCHAR buff[MAX_PATH] = {0};
_snwprintf( buff, MAX_PATH, L"OnKeyDown: %d", nChar );
CEdit::OnKeyDown( nChar, nRepCnt, nFlags );
}运行后结果是虽然我建立了键盘钩子,但改变的内容对OnChar和OnKeyDown两个函数的参数没有影响,这是为什么啊,应该怎么修改才能达到那个效果?这个钩子我建立的是局部钩子,我试过用全局的也不好使。

解决方案 »

  1.   

    重载对话框的 PreTranslateMessage(MSG* pMsg) 即可
    根据 pMsg->hwnd 判断是哪个编辑框的BOOL CDlg_TestDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_CHAR)
    {
    if(::GetDlgCtrlID(pMsg->hwnd) == IDC_EDIT1)
    {
    pMsg->wParam = 'X';
    }
    Beep(1000, 10);
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    return CallNextHookEx( NULL, code, wParam, lParam ); 
    return CallNextHookEx( NULL, code, 51, 262145 );//数字3 
    ================
    这是干什么时候啊?CallNextHookEx的作用可不是用来改参数的,它是将钩子传递给下一个挂钩程序的。如果你想通过钩子达到目的的话,应该在钩子处理函数中用keybd_event 来模拟键盘。
    另外上面说得不错,就你所要实现的功能来看,确实用不着钩子。
      

  3.   


    因为这个钩子我是挂为钩子链的最后一个,所以会最先被系统调用。所以我想在这个钩子里面把参数改掉再像后传递,使链后面的钩子拿到更改后的值。从而避免我在Edit框里输入时敲的内容被钩子监听。如果只在PreTranslateMessage里实现,PreTranslateMessage的调用时机应该是比钩子晚,会达不到这个作用吧。
      

  4.   

    知道结果了,钩子的类型各不一样。有的钩子只能得到消息,不能更改,如日志钩子。有的可以得到消息的值,并阻止消息继续传递,但不能更改,比如KEYBOARD_LL, 有的钩子就都可以,msdn上都写着的,英文不好,没看懂。
      

  5.   

    知道结果了,钩子的类型各不一样。有的钩子只能得到消息,不能更改,如日志钩子。有的可以得到消息的值,并阻止消息继续传递,但不能更改,比如KEYBOARD_LL, 有的钩子就都可以,msdn上都写着的,英文不好,没看懂。