gpt4 book ai didi

c++ - 写入 I/O 端口 Controller 驱动程序(输入)(PS/2 键盘端口)左右键盘按键?

转载 作者:行者123 更新时间:2023-11-28 07:11:26 27 4
gpt4 key购买 nike

我正在使用 inpout32/64 使用此系统驱动程序的硬件 I/O 端口 Controller InpOut32 and InpOutx64

我试图用它来绕过我在 DirectInput 游戏中遇到的问题。
(不能使用 SendInput,因为它会在没有很长 sleep 延迟的情况下拒绝输入,而且我不能等那么久它必须是非常快速的键盘输入)。

我目前让 inpout32 为我的大部分键盘键工作,我不知道如何访问左/右箭头键。

通过查看有关 PS/2 键盘的网页 PS/2 Keyboard commands

弄清楚这就是我需要的

0xE0, 0x4B   cursor left pressed
0xE0, 0x4D cursor right pressed

我如何发送这两个,我不明白 0xE0 是什么,我猜是扫描码以及 0x4B0x4D 是该扫描代码中的位置,但它在我的示例中不起作用,它一直为 LEFT 键发送 \

这是我正在使用的代码

BOOL isDriverOn = false;
#define LEFT 0x4B
#define RIGHT 0x4D

void setup() {
isDriverOn = IsInpOutDriverOpen();
}

//void _stdcall Out32(short PortAddress, short data);
//short _stdcall Inp32(short PortAddress);
void DD_PS2command(short comm, short value) {
if(!isDriverOn) {
printf("PS/2 Keyboard port driver is not opened\n");
return;
}
//keyboard wait.
int kb_wait_cycle_counter = 1000;
while((Inp32(0x64) & 0x02) && kb_wait_cycle_counter--) //wait to get communication.
Sleep(1);
if(kb_wait_cycle_counter) { //if it didn't timeout.
Out32(0x64, comm); //send command
kb_wait_cycle_counter = 1000;
while((Inp32(0x64) & 0x02) && kb_wait_cycle_counter--) //wait to get communication.
Sleep(1);
if(!kb_wait_cycle_counter) {
printf("failed to get communication in cycle counter timeout), who knows what will happen now\n");
//return false;
}
Out32(0x60, value); //send data as short
Sleep(1);
//return true;
} else {
printf("failed to get communication in counter timeout, busy)\n");
//return false;
}
}

void DD_Button(short btn, bool release = false, int delay = 0)
{
//0xE0, 0x4B {Left}
//0xE0, 0x4D {Rght}
//return scode | (release?0x80:0x00);
short scan_code = 0;
if(btn == LEFT)
scan_code = LEFT + 0xE0;
else if(btn == RIGHT)
scan_code = RIGHT + 0xE0;
else
scan_code = 0x0;

scan_code |= (release ? 0x80 : 0x00);

if(delay)
Sleep(delay);
DD_PS2command(0xD2, scan_code);
}




编辑: 问题已解决,下面的函数有效,只需要让 DD_PS2 命令返回 true/false(以指示它是否通过)。
新问题它会立即释放键但不会按住键。

这是所有的键http://www.computer-engineering.org/ps2keyboard/scancodes1.html

void DD_Button(short btn, bool release = false, int delay = 0)
{
//;0xE0, 0x4B {Left}
//;0xE0, 0x4D {Rght}
// return scode | (release? 0x80: 0x00)
short scan_code = 0;
bool good = false;
switch(btn) {
case LEFT:
case RIGHT:
scan_code = btn;
//send extended byte first (grey code)
good = DD_PS2command(0xD2, 0xE0);
break;
}
printf("good = %d\n", good);
scan_code |= (release ? 0x80 : 0x00);

if(delay)
Sleep(delay);
//0xD2 - Write keyboard output buffer
good = DD_PS2command(0xD2, scan_code);
printf("2 good = %d\n", good);
}

最佳答案

0xE0 是扩展键的转义码 - 即对于左侧,您发送 0xE0,然后立即发送 0x4B

关于c++ - 写入 I/O 端口 Controller 驱动程序(输入)(PS/2 键盘端口)左右键盘按键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912671/

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