WINDOWS OS如何获得的SCAN CODE
如题,这个问题一直困惑着我,是INT 16从键盘BUFFER取的吗?还有,是谁通知WINDOWS,让WINDOWS去取SCAN CODE?我是菜鸟,希望各们给予解惑! Windows下是通过keyboard Driver获取键盘输入的,而不是INT16。Keyboard会产生中断IRQ1(中断向量9),keyboard driver connect_irq
以后就会收到scancode了。
回复 2# peterhu 的帖子
谢谢Peter,那么当Connect_IRQ获取ScanCode后,它是不是把这个SCANCODE转化为一个STRUCT,然后放入键盘钩子链中呢?不知道我的理解对不对 用键盘勾子就只可以了,在AP层就可以完成。也可以用IRQ这样的软件来看一下驱动层是怎么完成这个事情的。
回复 4# winbondowen 的帖子
THS,键盘钩子那部分我会挂,但是不了解OS如何把那个STRUCT放入钩子链的,想弄清楚那方面的过程 你可以挂windbg去追这部分的流程,
另外<<windows核心编程>>也有讲解。 最近跟了下dos下是如何捕获按键的。 发现跟想象中的不一样。
在edit下面,如果没有按键,是不会主动跑int16来等待按键。 只有按键之后, 才会跑int16.但是跑完int16之后 并没有直接返回到你stop的地方,而是又跑了若干函数之后,才会跑到被中断的地方。
不清楚dos下是如何捕获有按键产生到处理的整个过程(刨除int09和16)。
请高手指点一下。
顺便问一下,2楼说 keyboard产生IRQ ,当INT09跑完之后,还应该由内核来做一些动作,然后才能返回到,当IRQ产生的时候,被打断的程序,然后继续跑,应该是这样的吧。楼主和2楼可以说的在详细点么? 顺便请教键盘中断程序怎么写? #include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <linux/keyboard.h>
#include <termios.h>
#define KEY_DOWN 0x100
#define KEY_UP 0x000
int oldmode;
struct termios new;
struct termios old;
int get_key_input(void)
{
int keyboard;
int keyboardcode;
keyboard = init_keyboard();
do{
keyboardcode = poll_keyboard(keyboard);
if((keyboardcode != 0) && (keyboardcode & KEY_DOWN)){
keyboardcode = keyboardcode & 0xFF;
//
}
}while( keyboard != 0x58);
exit_keyboard(keyboard);
return 0;
}
int exit_keyboard(int keyboard)
{
ioctl(keyboard, KDSKBMODE, oldmode);
tcsetattr( keyboard, 0, &old);
close(keyboard);
return 0;
}
int init_keyboard(void)
{
int keyboard;
keyboard = open("/dev/tty", O_RDONLY);
ioctl(keyboard, KDGKBMODE, &oldmode);
tcgetattr( keyboard, &old);
tcgetattr( keyboard, &new);
new.c_lflag &= ~(ICANON | ECHO | ISIG);
new.c_iflag = 0;
new.c_cc = 0;
new.c_cc = 1;
tcsetattr(keyboard, TCSAFLUSH, &new);
ioctl(keyboard, KDSKBMODE, K_RAW);
return keyboard;
}
int poll_keyboard(int keyboard)
{
unsigned char buf;
int n;
int kc = 0;
int i = 0;
int s = 0;
n = read(keyboard, &buf, sizeof(buf));
while( i < n){
s = (buf & 0x80) ? 0:1;
s = s << 8;
if((i + 2) < n && (buf & 0x7F) == 0 && ( buf & 0x80) != 0 && (buf & 0x80) != 0){
kc = ((buf & 0x7F ) << 7 ) |(buf & 0x7F);
i += 3;
}
else{
kc = buf & 0x7F;
i++;
}
}
kc = s | kc;
return kc;
}
好长的code啊
好长的code啊,能否概括一下
页:
[1]