windows - 将 Win32 API WndProc Key 消息从一个窗口传输到另一个窗口

标签 windows windows-mobile winapi keyboard wndproc

我正在使用 C++ 为 Windows Mobile 开发,但我遇到了一个问题 - 我添加了我的窗口 类,在其中我使用 WndProc 实现进行键盘输入。问题是 我得到了错误的代码,并且错误地识别了诸如 func 键之类的键,更糟糕的是,我得到的值(WM_KEYDOWNwParam > 消息)作为我在这里测试的两部手机之间的不同值 - 谁知道其他手机会发生什么。

在玩了很久之后,我发现如果我只从 预定义的“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/

相关文章:

windows - NameNode:无法在 Windows 7 中启动名称节点

windows - 谁能画出 SVN 分支的概念?

c# - 如何使用 C# 在 Windows CE 中将 SQL Server Compact 表导出到 Excel?

c++ CreateProcess() 不适用于带有正斜杠 "/"的 app 和 args - 与 App=NULL 一起使用

delphi - 如何在没有关联应用程序的情况下直接播放声音文件(mp3、wav 等)?

windows - 如何使用Windows命令提示符获取公共(public)IP地址?

Windows 命令行搜索带有目录的确切扩展名

sql-server - 有没有人使用(或考虑使用)Sql Server Compact Edition?

c++ - 检查是否连接了打印机

winapi - 我可以确定哪个进程向我的窗口发送了消息吗?