完善键盘


key_map和shift_map分别是一般情况和shift键按下时对应的按键,这是直接从linux代码拷贝过来的

mode 是键盘按下状态标志
位7:caps键按下,  位6:caps键的状态,位5:右alt键按下,  位4:左alt键按下
位3:右ctrl键按下,位2:左ctrl键按下,位1:右shift键按下,位0:左shift键按下

e0用来标识是e0还是e1

#include <linux/head.h>
#include <asm/io.h>

char key_map[]={
	0,27,
	'1','2','3','4','5','6','7','8','9','0','-','=',
	127,9,
	'q','w','e','r','t','y','u','i','o','p','[',']',
	13,0,
	'a','s','d','f','g','h','j','k','l',';','\'',
	'`',0,
	'\\','z','x','c','v','b','n','m',',','.','/',
	0,'*',0,32,		/* 36-39 */
	16,1,0,				/* 3A-49 */
	'-',0,0,0,'+',	/* 4A-4E */
	0,0,0,0,0,0,0,	/* 4F-55 */
	'<',
	10,1,0
	};
	
char shift_map[]={
	0,27,
	'!','@','#','$','%','^','&','*','(',')','_','+',
	127,9,
	'Q','W','E','R','T','Y','U','I','O','P','{','}',
	13,0,
	'A','S','D','F','G','H','J','K','L',':','\"',
	'~',0,
	'|','Z','X','C','V','B','N','M','<','>','?',
	0,'*',0,32,		/* 36-39 */
	16,1,0,		/* 3A-49 */
	'-',0,0,0,'+',	/* 4A-4E */
	0,0,0,0,0,0,0,	/* 4F-55 */
	'>',
	10,1,0
};

/*
*mode 是键盘按下状态标志
*位7:caps键按下,  位6:caps键的状态,位5:右alt键按下,  位4:左alt键按下
*位3:右ctrl键按下,位2:左ctrl键按下,位1:右shift键按下,位0:左shift键按下
*/
u8 mode = 0;
u8 leds = 2;
u8 e0 = 0;
void none(void)
{
	//disp_str("none");
}

void do_self(unsigned char scan_code)
{
	char	output[2];
	if(mode&0x20)//右alt按下
	{
		disp_str("Ralt");
	}
	else if(mode & 0x03)//shift键按下
	{
		output[0] = shift_map[scan_code];
		disp_str(output);
	}
	else
	{
		output[0] = key_map[scan_code];
		disp_str(output);
	}
}

void ctrl(void)
{
	if(e0&0x01)//右侧按下
	{
		mode =mode | 0x8;	
	}
	else
	{
		mode =mode | 0x4;
	}
}
void lshift(void)
{
	mode =mode | 0x1;
}
void rshift(void)
{
	mode =mode | 0x2;
}
void minus(unsigned char scan_code)
{
	do_self(scan_code);
}
void alt(void)
{
	if(e0&0x01)//右侧按下
	{
		mode =mode | 0x20;	
	}
	else
	{
		mode =mode | 0x10;
	}
}
void caps(void)
{
	disp_str("caps");
}
void func(void)
{
	disp_str("func");
}
void num(void)
{
	disp_str("num");
}
void scroll(void)
{
	disp_str("scroll");
}
void cursor(void)
{
	disp_str("cursor");
}
void unctrl(void)
{
	if(e0)//右侧按下
	{
		mode =mode & 0xf7;	
	}
	else
	{
		mode =mode & 0xfb;
	}
}
void unlshift(void)
{
	mode =mode & 0xfe;
}
void unrshift(void)
{
	mode =mode & 0xfd;
}
void unalt(void)
{
	if(e0)//右侧按下
	{
		mode =mode & 0xdf;	
	}
	else
	{
		mode =mode & 0xef;
	}
}
void uncaps(void)
{
	disp_str("uncaps");
}

typedef void (*function)(unsigned char scan_code);
#define Function(address)   (*(function)address)(unsigned char scan_code)
static function key_table[] =
{
   none,do_self,do_self,do_self	/* 00-03 s0 esc 1 2 */
	,do_self,do_self,do_self,do_self	/* 04-07 3 4 5 6 */
	,do_self,do_self,do_self,do_self	/* 08-0B 7 8 9 0 */
	,do_self,do_self,do_self,do_self	/* 0C-0F + ' bs tab */
	,do_self,do_self,do_self,do_self	/* 10-13 q w e r */
	,do_self,do_self,do_self,do_self	/* 14-17 t y u i */
	,do_self,do_self,do_self,do_self	/* 18-1B o p } ^ */
	,do_self,ctrl,do_self,do_self	/* 1C-1F enter ctrl a s */
	,do_self,do_self,do_self,do_self	/* 20-23 d f g h */
	,do_self,do_self,do_self,do_self	/* 24-27 j k l | */
	,do_self,do_self,lshift,do_self	/* 28-2B { para lshift , */
	,do_self,do_self,do_self,do_self	/* 2C-2F z x c v */
	,do_self,do_self,do_self,do_self	/* 30-33 b n m , */
	,do_self,minus,rshift,do_self	/* 34-37 . - rshift * */
	,alt,do_self,caps,func		/* 38-3B alt sp caps f1 */
	,func,func,func,func		/* 3C-3F f2 f3 f4 f5 */
	,func,func,func,func		/* 40-43 f6 f7 f8 f9 */
	,func,num,scroll,cursor		/* 44-47 f10 num scr home */
	,cursor,cursor,do_self,cursor	/* 48-4B up pgup - left */
	,cursor,cursor,do_self,cursor	/* 4C-4F n5 right + end */
	,cursor,cursor,cursor,cursor	/* 50-53 dn pgdn ins del */
	,none,none,do_self,func		/* 54-57 sysreq ? < f11 */
	,func,none,none,none		/* 58-5B f12 ? ? ? */
	,none,none,none,none		/* 5C-5F ? ? ? ? */
	,none,none,none,none		/* 60-63 ? ? ? ? */
	,none,none,none,none		/* 64-67 ? ? ? ? */
	,none,none,none,none		/* 68-6B ? ? ? ? */
	,none,none,none,none		/* 6C-6F ? ? ? ? */
	,none,none,none,none		/* 70-73 ? ? ? ? */
	,none,none,none,none		/* 74-77 ? ? ? ? */
	,none,none,none,none		/* 78-7B ? ? ? ? */
	,none,none,none,none		/* 7C-7F ? ? ? ? */
	,none,none,none,none		/* 80-83 ? br br br */
	,none,none,none,none		/* 84-87 br br br br */
	,none,none,none,none		/* 88-8B br br br br */
	,none,none,none,none		/* 8C-8F br br br br */
	,none,none,none,none		/* 90-93 br br br br */
	,none,none,none,none		/* 94-97 br br br br */
	,none,none,none,none		/* 98-9B br br br br */
	,none,unctrl,none,none		/* 9C-9F br unctrl br br */
	,none,none,none,none		/* A0-A3 br br br br */
	,none,none,none,none		/* A4-A7 br br br br */
	,none,none,unlshift,none		/* A8-AB br br unlshift br */
	,none,none,none,none		/* AC-AF br br br br */
	,none,none,none,none		/* B0-B3 br br br br */
	,none,none,unrshift,none		/* B4-B7 br br unrshift br */
	,unalt,none,uncaps,none		/* B8-BB unalt br uncaps br */
	,none,none,none,none		/* BC-BF br br br br */
	,none,none,none,none		/* C0-C3 br br br br */
	,none,none,none,none		/* C4-C7 br br br br */
	,none,none,none,none		/* C8-CB br br br br */
	,none,none,none,none		/* CC-CF br br br br */
	,none,none,none,none		/* D0-D3 br br br br */
	,none,none,none,none		/* D4-D7 br br br br */
	,none,none,none,none		/* D8-DB br ? ? ? */
	,none,none,none,none		/* DC-DF ? ? ? ? */
	,none,none,none,none		/* E0-E3 e0 e1 ? ? */
	,none,none,none,none		/* E4-E7 ? ? ? ? */
	,none,none,none,none		/* E8-EB ? ? ? ? */
	,none,none,none,none		/* EC-EF ? ? ? ? */
	,none,none,none,none		/* F0-F3 ? ? ? ? */
	,none,none,none,none		/* F4-F7 ? ? ? ? */
	,none,none,none,none		/* F8-FB ? ? ? ? */
	,none,none,none,none		/* FC-FF ? ? ? ? */
};
void do_keyboard(void)
{
	register unsigned char scan_code;
	scan_code=inb_p(0x60);
	if(scan_code==0xe0)
	{
		disp_str("0xe0");
		e0=e0|0x1;
		//scan_code=inb_p(0x60);
	}
	else if(scan_code==0xe1)
	{
		disp_str("0xe1");
		e0=e0|0x2;
		//scan_code=inb_p(0x60);
	}
	else
	{
		key_table[scan_code](scan_code);
		e0=0;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,实现了在C#中使用Windows API模拟按键和鼠标事件: ```csharp using System; using System.Runtime.InteropServices; public class VirtualKeyboard { private const int KEYEVENTF_EXTENDEDKEY = 0x1; private const int KEYEVENTF_KEYUP = 0x2; private const int VK_SHIFT = 0x10; private const int VK_CONTROL = 0x11; private const int VK_MENU = 0x12; private const int VK_LWIN = 0x5B; private const int VK_RWIN = 0x5C; [DllImport("user32.dll")] private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern bool SetCursorPos(int x, int y); [DllImport("user32.dll")] private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); private static void PressKey(byte keyCode) { keybd_event(keyCode, 0, 0, 0); } private static void ReleaseKey(byte keyCode) { keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0); } public static void Type(string text) { foreach (char c in text) { byte keyCode = (byte)Char.ToUpper(c); if (Char.IsLetterOrDigit(c)) { PressKey(keyCode); ReleaseKey(keyCode); } else { switch (c) { case ' ': PressKey(0x20); ReleaseKey(0x20); break; case '\n': PressKey(0x0D); ReleaseKey(0x0D); break; case '\t': PressKey(0x09); ReleaseKey(0x09); break; case '+': PressKey(VK_SHIFT); PressKey(0xBB); ReleaseKey(0xBB); ReleaseKey(VK_SHIFT); break; case '^': PressKey(VK_CONTROL); PressKey(keyCode); ReleaseKey(keyCode); ReleaseKey(VK_CONTROL); break; case '%': PressKey(VK_MENU); PressKey(keyCode); ReleaseKey(keyCode); ReleaseKey(VK_MENU); break; case '{': PressKey(VK_SHIFT); PressKey(0xDB); ReleaseKey(0xDB); ReleaseKey(VK_SHIFT); break; case '}': PressKey(VK_SHIFT); PressKey(0xDD); ReleaseKey(0xDD); ReleaseKey(VK_SHIFT); break; case '(': PressKey(VK_SHIFT); PressKey(0x39); ReleaseKey(0x39); ReleaseKey(VK_SHIFT); break; case ')': PressKey(VK_SHIFT); PressKey(0x30); ReleaseKey(0x30); ReleaseKey(VK_SHIFT); break; case '~': PressKey(VK_SHIFT); PressKey(0xC0); ReleaseKey(0xC0); ReleaseKey(VK_SHIFT); break; case '!': PressKey(VK_SHIFT); PressKey(0x31); ReleaseKey(0x31); ReleaseKey(VK_SHIFT); break; case '@': PressKey(VK_SHIFT); PressKey(0x32); ReleaseKey(0x32); ReleaseKey(VK_SHIFT); break; case '#': PressKey(VK_SHIFT); PressKey(0x33); ReleaseKey(0x33); ReleaseKey(VK_SHIFT); break; case '$': PressKey(VK_SHIFT); PressKey(0x34); ReleaseKey(0x34); ReleaseKey(VK_SHIFT); break; case '%': PressKey(VK_SHIFT); PressKey(0x35); ReleaseKey(0x35); ReleaseKey(VK_SHIFT); break; case '^': PressKey(VK_SHIFT); PressKey(0x36); ReleaseKey(0x36); ReleaseKey(VK_SHIFT); break; case '&': PressKey(VK_SHIFT); PressKey(0x37); ReleaseKey(0x37); ReleaseKey(VK_SHIFT); break; case '*': PressKey(VK_SHIFT); PressKey(0x38); ReleaseKey(0x38); ReleaseKey(VK_SHIFT); break; case '_': PressKey(VK_SHIFT); PressKey(0xBD); ReleaseKey(0xBD); ReleaseKey(VK_SHIFT); break; case '+': PressKey(VK_SHIFT); PressKey(0xBB); ReleaseKey(0xBB); ReleaseKey(VK_SHIFT); break; case '|': PressKey(VK_SHIFT); PressKey(0xDC); ReleaseKey(0xDC); ReleaseKey(VK_SHIFT); break; case ':': PressKey(VK_SHIFT); PressKey(0xBA); ReleaseKey(0xBA); ReleaseKey(VK_SHIFT); break; case '\"': PressKey(VK_SHIFT); PressKey(0xDE); ReleaseKey(0xDE); ReleaseKey(VK_SHIFT); break; case '<': PressKey(VK_SHIFT); PressKey(0xBC); ReleaseKey(0xBC); ReleaseKey(VK_SHIFT); break; case '>': PressKey(VK_SHIFT); PressKey(0xBE); ReleaseKey(0xBE); ReleaseKey(VK_SHIFT); break; case '?': PressKey(VK_SHIFT); PressKey(0xBF); ReleaseKey(0xBF); ReleaseKey(VK_SHIFT); break; default: break; } } } } public static void Click(int x, int y) { SetCursorPos(x, y); mouse_event(0x2, x, y, 0, 0); mouse_event(0x4, x, y, 0, 0); } public static void RightClick(int x, int y) { SetCursorPos(x, y); mouse_event(0x8, x, y, 0, 0); mouse_event(0x10, x, y, 0, 0); } public static void DoubleClick(int x, int y) { SetCursorPos(x, y); mouse_event(0x2, x, y, 0, 0); mouse_event(0x4, x, y, 0, 0); mouse_event(0x2, x, y, 0, 0); mouse_event(0x4, x, y, 0, 0); } public static void Scroll(int delta) { SendMessage(IntPtr.Zero, 0x20a, IntPtr.Zero, new IntPtr(delta * 120)); } public static void PressWinKey() { PressKey(VK_LWIN); ReleaseKey(VK_LWIN); } public static void PressCtrlAltDel() { PressKey(VK_CONTROL); PressKey(VK_MENU); PressKey(0x2E); ReleaseKey(0x2E); ReleaseKey(VK_CONTROL); ReleaseKey(VK_MENU); } } ``` 该类包含了模拟按键和鼠标事件的方法,其中Type方法可以接收一个字符串并模拟在键盘上键入该字符串,支持特殊字符和组合键。Click、RightClick和DoubleClick方法可以模拟鼠标左键、右键和双击事件,Scroll方法可以模拟鼠标滚轮事件,PressWinKey方法可以模拟按下Windows键,PressCtrlAltDel方法可以模拟Ctrl+Alt+Del组合键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值