处理对话框上的键盘输入 - Windows
Handling keyboard input on a dialog - Windows
我正在编写一个基于非模态对话框的应用程序。我正在使用Visual Studio资源编辑器来构建对话框并创建应用程序。到目前为止,一切都很顺利。但是,在处理键盘输入时,我已经达到了一堵砖墙。我的研究表明,Windows在到达对话框回调过程之前捕获键盘输入,以实现使用键盘移动焦点的功能。
我创建了一个基本的对话框来测试这一点,当我有一个没有任何控件的对话框时,一切都按照我预期的那样工作。当我添加控件时,它停止工作。
以下是裸露项目的代码:
#include <Windows.h>
#include <CommCtrl.h>
#include <tchar.h>
#include "resource.h"
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND dlghandle;
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE h0, LPTSTR lpCmdLine, int nCmdShow)
{
HWND hDlg;
MSG msg;
BOOL ret;
hDlg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0, DialogProc, 0);
ShowWindow(hDlg, nCmdShow);
dlghandle = hDlg;
while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
if (ret == -1)
return -1;
if (!IsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
MessageBox(NULL, L"Test", L"Test", MB_OK);
break;
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return 0;
}
我有哪些选择?
键盘输入出现的第一个位置是您的消息循环,因此只需检查您要查找的按键,然后再将其传递给 IsDialogMessage()
/TranslateMessage()
/DispatchMessage()
。例如:
while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
if (ret == -1)
return -1;
if (msg.message == WM_KEYDOWN && msg.wParam == 'Q')
{
// trap and handle the Q key no matter which control has focus
}
else
if (!IsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
如果你愿意,你甚至可以把它包装在一个函数中,使其更整洁,例如:
#define MYMSG_DOSOMETHING (WM_APP + 1)
BOOL MyIsDialogMessage(HWND hDlg, MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q')
{
PostMessage(hDlg, MYMSG_DOSOMETHING, 0, 0);
return TRUE;
}
return IsDialogMessage(hDlg, pMsg);
}
// then your message loop would be:
while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
if (ret == -1)
return -1;
if (!MyIsDialogMessage(hDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
您也可以使用 SetWindowsHook 创建低级键盘进程。请注意,这看起来有点复杂和高级,但它适用于对话框,而无需对消息循环进行任何额外的努力。
HHOOK g_hLowLevelKeyHook;
//windows Main.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
g_hLowLevelKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), NULL);
........
.......
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
if (nCode == HC_ACTION && wParam == WM_KEYUP)
{
if (pkbhs->vkCode == VK_F1)
MessageBoxA(NULL"F1 Pressed","INFO",MB_ICONINFORMATION);
}
return CallNextHookEx(g_hLowLevelKeyHook, nCode, wParam, lParam);
}
相关文章:
- 无法在windows控制台中为C++程序提供必要的输入
- Windows.h 输入在函数之外不起作用
- 使用 Windows API c++ 的键盘输入
- 在Windows中将用户输入屏蔽为星号
- 如何在 Windows 10 上使用 InjectTouchInput() 和 PT_PEN 从数字化仪注入笔输入
- 如何使用C++在Windows中输出和输入UTF8或UTF16 Unicode文本?
- Windows 中应用程序的每秒输入/输出操作数
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- Windows SetFocus,目标窗口不会捕获键盘输入
- 读取 USB 相机的输入编辑并将输出发送到 Windows 上的虚拟相机
- QTCreator G .EXE:致命错误:无输入文件(Windows)
- 如何监视Windows USB端口上的输入
- 如何测试 Windows 中的触摸输入是来自手指还是触笔?在 C/C++ 中
- Windows C - 需要想法 - 在同一应用/窗口中将鼠标输入和原始输入组合在一起
- 如何在控制台应用程序中使用GetMessage()使用Windows API识别C++中的键盘输入
- 如何在windows中的gcc中逐行读取命令输出,就像使用标准输入一样
- 现代Windows输入API/用户交互API
- Windows:如何让子进程在不关闭输入匿名管道的情况下读取它
- Unicode 输入 Windows 8.1 应用商店应用程序
- 处理对话框上的键盘输入 - Windows