我正在使用 C++ 为 Windows Mobile 开发,但我遇到了一个问题 - 我添加了我的窗口
类,在其中我使用 WndProc
实现进行键盘输入。问题是
我得到了错误的代码,并且错误地识别了诸如 func 键之类的键,更糟糕的是,我得到的值(WM_KEYDOWN
的 wParam
> 消息)作为我在这里测试的两部手机之间的不同值 - 谁知道其他手机会发生什么。
在玩了很久之后,我发现如果我只从 预定义的“EDIT”类,我实际上确实得到了正确的输入(就字母/键而言)。
所以问题一定不是出在手机上,而是出在接收消息的方式上(win32有点小白,知识匮乏请见谅)。我尝试使用输入模式,但使用 EM_NUMBERS 等向我的窗口发送消息总是失败。
所以我想做的(尽管我愿意听取建议)是以某种方式从某个隐藏的 EDIT 窗口获取字符,然后将它们转发到我的窗口。 (虽然我仍然需要我的窗口获得焦点,以便它能够正确响应不同于 WM_KEYDOWN
等的消息)
有什么办法吗?
这是我第 3 次询问这个问题,我永远感谢到目前为止所有试图提供帮助的人(如果我设法解决了我的问题,我会更加感激)
以下是相关代码摘录:
类(class)注册:
WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ROADMAP));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
window creation
if (width == -1) width = CW_USEDEFAULT;
if (height == -1) height = CW_USEDEFAULT;
RoadMapMainWindow = CreateWindow(g_szWindowClass, szTitle, OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, width, height,
NULL, NULL, g_hInst, NULL);
MessageLoop
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
WNDPROC 摘录:
case WM_KEYDOWN:
{
WORD Code = (WORD)wParam;
int iRepeatTimes = (lParam & 0x0000FFFF);
int iScanCode = (lParam & 0x00FF0000) >> 16;
BOOL bALT_IsDown = (lParam & 0x20000000)? TRUE: FALSE;
BOOL bAlreadyPressed= (lParam & 0x40000000)? TRUE: FALSE;
BOOL bNowReleased = (lParam & 0x80000000)? TRUE: FALSE;
return DefWindowProc(hWnd, message, wParam, lParam);
}
最佳答案
WM_KEYDOWN
的 wParam 是一个虚拟键码,实际上并没有限制为 ascii(或 unicode)字符 - 它只是一个在平台上唯一标识键的代码。
如果您想要“文本” - 您想要等待 WM_CHAR
消息 - WM_CHAR
的 wParam 将是用户输入的实际字符值。
更多信息 - 在您的应用程序循环中 - 您调用 TranslateMessage
的地方 - 它实际上是 TranslateMessage
的工作来发现 WM_KEYDOWN
消息并合成并发布相应的 WM_CHAR
消息。
TranslateAccelerator
似乎是唯一可以干扰已发布消息的东西。
当然,如果 Windows 消息进程在错误的时间(或未)将消息传递给 DefWindowProc
,有时会出现非常不寻常的行为。例如,为什么要在 WM_KEYDOWN
处理程序中显式调用 DefWindowProc
?正确处理该问题的最简单方法是将 DefWindowProc
作为窗口过程执行的最后一件事,这样所有已处理和未处理的消息都默认转到那里。异常(exception)情况是您希望阻止 DefWindowProc
获取消息的消息(例如,如果您处理它,则为 WM_PAINT
)。
您还一直提到尝试使用 Edit_SetInputMode
- Edit_SetInputMode
向窗口发送一条消息:EM_SETINPUTMODE
- 这是一条只有编辑控件。由于您已经注册了自己的窗口类,因此“EM_SETINPUTMODE”将不执行任何操作。
关于windows - 将 Win32 API WndProc Key 消息从一个窗口传输到另一个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716385/