2

我正在用 C++ 为 Windows Mobile 开发,我遇到了一个问题 - 我添加了我的窗口类,并在其中我的键盘输入与我的WndProc实现。问题是我得到了错误的代码,并且错误地识别了诸如 func 键之类的键,更糟糕的是,我得到的值(消息wParamWM_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);  
}  
4

3 回答 3

2

wParam ofWM_KEYDOWN是一个虚拟键代码,它并没有真正被限制为 ascii(或 unicode)字符 - 它只是一个唯一标识平台上键的代码。

如果您想要“文本” - 您想要等待WM_CHAR消息 - wParamWM_CHAR将是用户输入的实际字符值。


更多信息 - 在您的应用程序循环中 - 您调用的地方TranslateMessage- 实际上是TranslateMessage发现WM_KEYDOWN消息并合成和发布相应WM_CHAR消息的工作。


TranslateAccelerator似乎是唯一可以干扰发布消息的东西。当然,如果windows message procDefWindowProc在错误的时间(或没有)将消息传递给,有时可能会出现非常不寻常的行为。例如,为什么您DefWindowProcWM_KEYDOWN处理程序中有显式调用?正确处理该问题的最简单方法是DefWindowProc将窗口进程作为最后一件事,以便所有已处理和未处理的消息都默认发送到那里。例外情况是您希望阻止DefWindowProc获取消息的消息(WM_PAINT例如,如果您处理它)。


您还一直提到尝试使用Edit_SetInputMode-Edit_SetInputMode向窗口发送一条消息:EM_SETINPUTMODE- 这是一条只有 EDIT 控件才能理解的消息。由于您已经注册了自己的窗口类,“EM_SETINPUTMODE”将什么也不做。

于 2009-11-11T18:09:20.087 回答
0

我没有遇到你描述的任何问题,所以我真的很想看到一组简单的代码来重现这个。众所周知,有些手机会收到虚假的用户范围消息,但这些消息不应该影响您所处的水平。您为如此基本的东西得到错误代码的事实向我表明,您的窗口创建或消息处理代码一定有问题。

于 2009-11-11T16:42:55.077 回答
0

我只是在猜测,但也许您的应用程序是 Ansi 应用程序?这也许可以解释不同的代码页给你不同的键码。那么您是否尝试在项目设置中将其全部设为 Unicode,并相应地定义字符串常量?您是否尝试过 ctacke 的建议来制作一个非常基本的应用程序?

于 2009-12-15T12:04:35.327 回答