2013-03-17 119 views
0

我有一个未设置为“只读”的文本框,所以理论上我应该可以写入它。它通过Edit_Enable(hwnd,true),Edit_SetReadOnly(hwnd,false)和SetFocus(hwnd)激活。我可以通过点击文本框来关注文本框,我甚至可以看到插入符号闪烁,但是,当按任意键时,文本框不会收到输入。我可以用Edit_SetText()来设置它的文本,但我不能手动写入任何东西。WINAPI控件“编辑”-Textbox没有收到用户输入

我创建这个文本框与下面的代码:

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL /*| ES_OEMCONVERT*/ | ES_LEFT /*| ES_WANTRETURN */| WS_TABSTOP; 
     HWND h = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", (LPCWSTR)NULL, dwStyle, posX, posY, width, height, hParent, NULL, (HINSTANCE)GetModuleHandle(NULL), NULL); 

的消息在该函数处理。它被称为每一帧。

bool PumpMessages() 
{ 
    MSG msg; 
    ZeroMemory(&msg, sizeof(MSG)); 

    bool bQuit = false; 

    // Use PeekMessage() so we can use idle time to update the system. 
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     // Translate and dispatch the message 
     TranslateMessage(&msg); 

     // ultra gay message bug workaround 
     if (msg.message == WM_QUIT) 
     { 
      bQuit = true; 
     } 

     DispatchMessage(&msg); 
    } 

    return bQuit; 
} 

和消息的过程看起来像以下:

LRESULT CALLBACK Window::WndProcThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    { 
    if (msg == WM_CHAR) 
     Log("WM_CHAR"); 
    ... 
    // Finally, if the message isn't consumed by the window or any registered listeners, let Windows do its thing. 
    return msgConsumed ? 0 : DefWindowProc(hWnd, msg, wParam, lParam); 
    } 

第二怪的事情发生在这里的WndProcThunk消息过程英寸没有记录WM_CHAR消息。我认为这是我的TextBox没有做任何事情的原因,因为它需要WM_CHAR消息在用户按键上作出反应。我必须找到为什么没有发送WM_CHAR消息的原因,尽管我在我的PumpMessages函数中使用了TranslateMessage()。有任何想法吗?

+0

检查您是否收到'WM_KEYDOWN'消息。这些是TranslateMessage用作输入的东西。 – rodrigo 2013-03-17 21:00:56

+0

@rodrigo我也没有在WndProcThunk中获取WM_KEYDOWN消息。我也在同一个线程中使用DirectInput 8。这可能会影响winapi密钥处理吗? – u7f1mrfpf 2013-03-17 21:05:28

+0

哪个窗口是'WndProcThunk'的窗口过程?你会期望'WM_CHAR'消息去焦点的窗口,这大概是编辑控制? – 2013-03-17 21:55:49

回答

0

PeekMessage返回FALSE如果消息队列中没有消息,那么消息循环将立即退出。您需要切换到使用GetMessage或重构循环,以便您使用bQuit标志作为测试而不是返回值PeekMessage

+0

这并不重要,因为每个帧都会调用PumpMessages函数。当它返回一次时,应用程序将退出。 – u7f1mrfpf 2013-03-17 20:54:25

+0

哎呀,对不起,我错过了那个细节! – 2013-03-17 21:53:14

0

我通过禁用DirectInput API解决了这个问题。 DirectInput 8实际上正在吃掉所有WM_KEYDOWM消息,导致没有发送WM_CHAR消息。但是文本框需要WM_CHAR消息来对用户输入做出反应。这是API的奇怪行为。如果有人有想法解决这个问题而不禁用DirectInput,请随时发布。但是从现在起我将使用GetAsyncKeyState()来进行键盘输入。