-1

我有一个未设置为“只读”的文本框,所以理论上我应该能够写入它。它通过 Edit_Enable(hwnd, true)、Edit_SetReadOnly(hwnd, false) 和 SetFocus(hwnd) 激活。我可以通过单击来给文本框焦点,我什至可以看到插入符号在闪烁,但是,当我按下任何键时,文本框不会收到任何输入。我可以用 Edit_SetText() 设置它的文本,但我不能手动向它写任何东西。

我使用以下代码创建此文本框:

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);

        // 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()。有任何想法吗?

4

2 回答 2

0

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

于 2013-03-17T20:50:50.757 回答
0

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

于 2013-03-18T11:11:55.553 回答