我有一个未设置为“只读”的文本框,所以理论上我应该可以写入它。它由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()。有什么想法吗?
答案 0 :(得分:0)
PeekMessage
返回FALSE
,因此您的消息循环几乎会立即退出。您需要切换到使用GetMessage
或重构循环,以便使用bQuit
标记作为测试,而不是PeekMessage
的返回值。
答案 1 :(得分:0)
我通过禁用DirectInput API解决了这个问题。 DirectInput 8实际上正在吃掉所有WM_KEYDOWM消息,导致没有发送WM_CHAR消息。但是文本框需要WM_CHAR消息来响应用户输入。这是API的一种奇怪行为。如果有人有想法在不禁用DirectInput的情况下修复此问题,请随时发布。但是从现在开始我将使用GetAsyncKeyState()进行键盘输入。