我正在用 C++ 为 Windows Mobile 开发,我遇到了一个问题 - 我添加了我的窗口类,并在其中我的键盘输入与我的WndProc
实现。问题是我得到了错误的代码,并且错误地识别了诸如 func 键之类的键,更糟糕的是,我得到的值(消息wParam
的WM_KEYDOWN
值)是我在这里拥有的两部手机之间的不同值用于测试 - 谁知道其他手机会发生什么。
在玩了很长时间之后,我发现如果我只从预定义的“EDIT”类创建一个窗口,我实际上确实可以正确输入(就字母/键而言)。
所以问题一定不在手机上,而在于获取消息的方式(win32有点新手,见谅)。我尝试使用输入模式,但使用 EM_NUMBERS 向我的窗口发送消息,总是失败。
所以我想做的(尽管我愿意接受建议),就是从某个隐藏的编辑窗口中获取字符,然后将它们转发到我的窗口。(虽然我仍然需要我的窗口来获得焦点,以便它能够正确响应不同的消息WM_KEYDOWN
等)
有没有办法做到这一点?
这是我第三次询问这个问题,我永远感谢迄今为止试图提供帮助的每个人(尽管如果我设法解决了我的问题,我会更加感激)
以下是相关代码摘录:
班级注册:
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);
}