【问题标题】:send scancode to my application将扫描码发送到我的应用程序
【发布时间】:2012-03-14 17:39:13
【问题描述】:

我有一个关于扫码和扩展的问题 好的。

我在 C++ 中创建了一个简单的窗口,我只想检测 WM_KEYUP(VK_UP 值)

现在我运行 spy++ 并按下向上键,我检测到我的消息是这样的

keydown  vk_up    crepeat1     scancode 48     extended1      altdown0     frepeat1      up0    

现在,如果我向我的应用程序发送消息,我会收到以下消息

SendMessage ( wnd , WM_KEYDOWN , VK_UP ,1);

keydown  vk_up    crepeat1     scancode 00     extended0      altdown0     frepeat1      up0 

您会看到扫描码和其他值的不同。

我的问题是为什么即使我发送相同的消息也会如此不同? 2 有什么方法可以发送扫描码(和其他值到我的应用程序并获得相同的值)

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    不知道为什么会有差异,但您可以使用keybd_eventSendInput 函数来合成击键。

    【讨论】:

    • 谢谢,但是 keybd_event 或 SendInput 都向其他窗口发送值,我只想向我的应用程序指定消息
    【解决方案2】:

    检查 WM_KEYDOWN 的文档。扫描代码包含在 LPARAM 参数的第 16 位到第 23 位中。您传递了 1,因此扫描码位全为零。

    这没关系,实际上检查扫描码的应用程序并不多。然而,使用 SendMessage() 是不正确的,键盘消息进入消息队列。您应该使用 PostMessage()。不同之处在于,许多消息循环着眼于击键以实现加速器(也称为快捷键)。并调用 TranslateMesssage() 将 WM_KEYDOWN 消息转换为 WM_CHAR 消息用于键入键。

    还有一个问题,一个无法解决的问题,你无法控制键盘的状态。 Ctrl、Alt 和 Shift 修饰符。如果用户碰巧按下了 Shift 键,应用程序将看到 Shift+Up,它可能会以非常不同的方式解释它,编辑当然会这样做。只有使用 SendInput() 才能解决这个问题。

    【讨论】:

      【解决方案3】:
      SendMessage ( wnd , WM_KEYDOWN , VK_UP ,0x00480001); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多