我正在使用C ++开发Windows Mobile,我遇到了一个问题 - 我添加了我的窗口
类,在其中我用我的WndProc
实现键盘输入。问题是
我得到了错误的代码,并且错误地识别了诸如func键之类的键,并且使其变得更糟,我得到的值(wParam
消息的WM_KEYDOWN
)作为不同的值我在这两个手机之间进行测试 - 谁知道其他手机会发生什么。
在玩了好几年之后,我发现如果我只是从它创建一个窗口 预定义的“EDIT”类,我实际上确实得到了输入(在字母/键方面)。
所以问题一定不在手机中,而是在获取信息的模式(在win32中有点新手,请原谅我缺乏知识)。我尝试使用输入模式,但是使用EM_NUMBERS向我的窗口发送消息等等,总是失败。
所以我想做什么(虽然我愿意接受建议),不知何故只是从一些隐藏的EDIT窗口获取角色,并将它们转发到我的窗口。 (虽然我仍然需要我的窗口才能获得焦点,因此它会对不同于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);
}
答案 0 :(得分:2)
WM_KEYDOWN
的wParam是一个虚拟键码,它实际上并不局限于ascii(或unicode)字符 - 它只是一个唯一标识平台上键的代码。
如果你想要'text' - 你想等待WM_CHAR
消息 - WM_CHAR
的wParam将是用户输入的实际字符值。
更多信息 - 在您的应用程序循环中 - 您致电TranslateMessage
- 实际上TranslateMessage
的工作是发现WM_KEYDOWN
条消息并合成并发布相应的WM_CHAR
消息。
TranslateAccelerator
似乎是唯一可以干扰发布消息的内容。
当然,如果Windows消息proc是(或不是)在错误的时间将消息传递给DefWindowProc
,有时会出现非常不寻常的行为。例如,为什么您在DefWindowProc
处理程序中显式调用WM_KEYDOWN
?正确处理这种情况的最简单方法是将DefWindowProc
作为窗口proc的最后一项操作,以便所有处理和未处理的消息默认都在那里。例外情况是您希望阻止DefWindowProc
获取消息的消息(例如,如果您处理消息,则为WM_PAINT
。)
您还不断提及尝试使用Edit_SetInputMode
- Edit_SetInputMode
向窗口发送消息:EM_SETINPUTMODE
- 这是仅由EDIT控件理解的消息。由于您已经注册了自己的窗口类,'EM_SETINPUTMODE`将不会执行任何操作。
答案 1 :(得分:0)
我没有像你描述的那样有任何问题,所以我真的很想看到一组代码重复的代码。众所周知some phones get spurrious user-range messages但这些不应该影响到你所处的水平。您收到错误代码的事实是如此基本,这表明您在窗口创建或消息处理代码中必须出错。
答案 2 :(得分:0)
我只是猜测,但也许你的应用程序是Ansi应用程序?这可能解释了不同的代码页为您提供了不同的密钥代码。那么您是否尝试在项目设置中将其全部设为Unicode,并相应地定义字符串常量?你是否尝试过ctacke建议制作一个非常基本的应用程序?