在我的界面中,我有几个按钮,一个组合框和一个显示图像序列的窗口。这些按钮在序列中导航,但我还想浏览键盘上的左箭头和右箭头。编译后键盘键工作正常,因为Focus设置在主窗口,但单击按钮或组合后键盘键不起作用。我在主循环中使用SetFocus(main_hwnd)管理它,但单击时组合框不会响应。
以下示例:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateWindowEx(0, "COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST, 478, 5, 50, 200, hwnd, (HMENU)ID_COMBO1, GetModuleHandle(NULL), NULL);
break;
case WM_COMMAND:
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_SPACE:
PostQuitMessage(0);
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
// SetFocus(hwnd);
return 0;
}
假设这个例子: 编译后,SPACE KEY将起作用,但点击组合框后,它将无法工作。如果我使用SetFocus(hwnd),SPACE KEY将始终有效,但组合框将被禁用。
感谢您的帮助。
答案 0 :(得分:1)
他们将键盘消息调度到具有焦点的窗口。这不会是你的主窗口,组合框看到它。这通常由Windows内置的对话框逻辑处理,但您可能没有创建对话框。不知道你想要多远,任何类库都会为你处理这个问题,主要是在调度消息之前,通过对控件进行子类化并在消息循环中查找导航键。
答案 1 :(得分:1)
是的,您的窗口过程仅适用于该窗口,组合框是一个单独的窗口。我喜欢在消息循环中处理我的热键,如下所示:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
if (msg.message == WM_KEYDOWN)
{
if ((UINT)msg.wParam == VK_SPACE)
{
return 0; // or use postquitmessage
}
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}