将Win32 API WndProc密钥消息从一个窗口传输到另一个窗口

时间:2009-11-11 16:32:18

标签: windows windows-mobile winapi keyboard wndproc

我正在使用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);  
}  

3 个答案:

答案 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建议制作一个非常基本的应用程序?