none
输入框如何截获消息事件 RRS feed

  • 问题

  • CreateWindow(TEXT("edit"), TEXT(""), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, pcep->hwnd, NULL, NULL, NULL);
    用这个创建输入框后,所有的按键消息事件全部被这个子窗口吸收,在主消息循环里面没法截获按键消息事件,比如我输完字要点击“回车”键来表示已经输入完毕准备提交,可是所有的按键都只在输入框内有效,这样小弟无法截获回车事件来进行其他处理,请问各位高手有什么截获事件的解决办法,或是有能在点击某个按钮就让这个窗口里面的事件全部无效,把按键事件重新交回主循环的方法?
    2009年6月9日 10:02

答案

  • 找个地方放下面这个变量:
    WNDPROC OldEditCallBack;

    做如下函数声明:
    LRESULT CALLBACK EditCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

    在创建窗口的地方调用以下代码:
    HWND wndEdit = ::CreateWindow(TEXT("edit"), TEXT(""), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, pcep->hwnd, NULL, NULL, NULL);
    OldEditCallBack = (WNDPROC)::SetWindowLong(wndEdit , GWL_WNDPROC, (LONG)EditCallBack);

    实现EditCallBack函数:
    LRESULT CALLBACK EditCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            switch (message)
            {
            case WM_KEYUP:
            case WM_CHAR:
                    {
                            // 处理回车消息,0d或0a代表回车
                            if ((0x0d == (unsigned char)wParam)
                                    || (0x0a == (unsigned char)wParam))
                            {
                                    // to do...做你想做的事,比如
                                    ::MessageBox(...);
                            }
                            break;
                    }
            }

            return ::CallWindowProc(OldEditCallBack, hWnd, message, wParam, lParam) ;
    }

    2009年6月9日 10:10