我有一个未设置为“只读”的文本框,所以理论上我应该可以写入它。它通过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()。有任何想法吗?
检查您是否收到'WM_KEYDOWN'消息。这些是TranslateMessage用作输入的东西。 – rodrigo 2013-03-17 21:00:56
@rodrigo我也没有在WndProcThunk中获取WM_KEYDOWN消息。我也在同一个线程中使用DirectInput 8。这可能会影响winapi密钥处理吗? – u7f1mrfpf 2013-03-17 21:05:28
哪个窗口是'WndProcThunk'的窗口过程?你会期望'WM_CHAR'消息去焦点的窗口,这大概是编辑控制? – 2013-03-17 21:55:49