gpt4 book ai didi

c++ - SendInput 不适用于 Print Screen 键

转载 作者:可可西里 更新时间:2023-11-01 12:50:33 24 4
gpt4 key购买 nike

我正在为各种模拟器制作前端并触发它们的各种功能,例如保存/加载状态、保存屏幕截图,但具有统一的界面。 FS-UAE 烦人地使用“Print Screen”作为其屏幕截图键,我想避免用户不得不更改模拟器的默认热键设置。

除了“Print Screen”键外,我已经成功地用 SendInput 模拟了我想要的任何按键。

我在使用虚拟键码方面没有任何运气,我认为这不适用于全屏应用程序。因此,该部分代码被注释掉了。 (编辑:更好的解释——虚拟键代码被 DirectInput 软件忽略)

使用扫描码,我几乎可以按任何键。 Print Screen 似乎是个异常(exception)。

这是我用于扫描代码的引用; https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx

下面是重现问题的最小可行代码。如果你运行它,按一个键然后快速切换到记事本并等待 2 秒,它应该按字母“q”进入记事本,然后退出。

将扫描码从 0x10 (q) 更改为 0x37(Print Screen),确保在两个地方都执行此操作 - KEY DOWN 和 KEY UP。

现在再次运行它,按下一个键并等待。要查看 Print Screen 是否有效,请打开 MS Paint 或其他工具,然后按 CTRL+V,查看是否获得桌面的屏幕截图。它不起作用!但是,如果您手动按 Print Screen,然后 CTRL+V 进入 MS Paint,它将起作用。

为什么 Print Screen 键不起作用?

#include "stdafx.h"

//For create process & keyboard codes
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int main()
{
INPUT ip = {};

ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.wVk = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.dwFlags = 0;

printf("Press a key, then taskswitch.\n");
system("pause");
Sleep(2000);

//KEY DOWN
ip.ki.wScan = 0x10; //0x37 PrintScreen, 0x10 Q
ip.ki.dwFlags = KEYEVENTF_SCANCODE;
//ip.ki.wVk = VK_SNAPSHOT;
//ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));

//KEY UP
ip.ki.wScan = 0x10;
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
//ip.ki.wVk = VK_SNAPSHOT;
//ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));

printf("Done.\n");
system("pause");
return 0;
}

最佳答案

使用 wVk 而不是 wScan,并确保未设置 KEYEVENTF_SCANCODE,因为它会忽略 wVk。你必须使用 VK_SNAPSHOT

INPUT ip[2] = { 0 };

ip[0].type = INPUT_KEYBOARD;
ip[0].ki.wVk = VK_SNAPSHOT;

ip[1] = ip[0];
ip[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, ip, sizeof(INPUT));

关于c++ - SendInput 不适用于 Print Screen 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48422112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com