成都网站建设设计

将想法与焦点和您一起共享

c语言中的键盘检测函数 c语言中的键盘检测函数是什么

c语言怎样判断键盘按键的按下、释放?

C语言判断键盘按下和释放,是通过检测该键的状态来实现的。如果是单一的一个按键,那么直接检测该键是“1”还是“0”,就可以确定是按下还是释放。如果是矩阵键盘,那么需要发送扫描码,再检测输入值,来判断键盘中键的状态。以下举例说明:

员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联建站坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供成都网站设计、做网站、微信公众号开发、电商网站开发,小程序设计,软件按需求定制设计等一站式互联网企业服务。

bit keychk()    //单一按键检测

{

if(P1.0==0)    //如果键按下

{

delay();     //延时去抖

if(P1.0==0)return(1);    //返回键状态

}

return(0);

}

unsigned char kbscan(void)    //矩阵扫描按键检测

{

unsigned char sccode,recode;

P1=0x0f;  //发0扫描,列线输入

if ((P2  0x0f) != 0x0f)  //有键按下

{

delay(20);   //延时去抖动

if ((P10x0f)!= 0x0f)

{

sccode = 0xef;    //逐行扫描初值

while((sccode0x01)!=0)

{

P1=sccode;

if((P10x0f)!=0x0f)

{

recode=(P10x0f)|0xf0;

while((P10x0f)!=0x0f);//等待键抬起

return((~sccode)+(~recode));

}

else

sccode=(sccode1)|0x01;

}

}

}

return 0;  //无键按下,返回0

}

C语言键盘内容读取

综观TC提供的键盘输入函数,以bioskey函数为最合适选择。

int bioskey(int cmd);

使用BIOS中断0x16执行各种键盘操作。参数cmd确定实际得操作。

bioskey的返回值由cmd决定:

0:低8位非0,返回在队列中等待的下一输入键的ascii字符或键盘的下一次按键输入的ascii字符。低8位为0,则高8位为扩展键盘码。

1:测试是否有可读的输入键,为0,则没有。Ctrl_break 返回0xffff(-1)。否则,返回下一个输入键。键值还保存,供下次cmd=0时bioskey调用返回。

2:请求当前换档键状态。状态值由下列值相或(or)得到:

位7 0x80 Insert ON

6 0x40 Caps ON

5 0x20 Numlock ON

4 0x10 Scroll Lock ON

3 0x08 ALT

2 0x04 CTRL

1 0x02 - SHIFT

0 0x01 - SHIFT

为了方便起见,我们首先定义一些常用功能键的键值。

#define ReturnKey 0x0d

#define ESC 0x1b

#define Back 0x08

#define LeftArrow 0x4b00

#define RightArrow 0x4d00

#define UpArrow 0x4800

#define DownArrow 0x5000

#define PageUp 0x4900

#define PageDown 0x5100

#define Home 0x4700

#define End 0x4f00

#define F1 0x3b00

#define F2 0x3c00

#define F3 0x3d00

#define F4 0x3e00

#define F5 0x3f00

#define F6 0x4000

#define F7 0x4100

#define F8 0x4200

#define F9 0x4300

#define F10 0x4400

int GetKey(void)

{

int tKey;

while(bioskey(1)==0)

;

tKey=bioskey(0);

if ((tKey 0xff)!=0)

tKey=tKey 0xff;

return tKey;

}

以上代码,可基本完成常用程序键盘读取操作。

但我们必须注意到,对于函数GetKey的定义中,bioskey函数的使用,我们只是对cmd=0,1的情况进行了处理,而对于cmd=2,也即换档键状态没有进行处理,因而诸如ctrl-home等等GetKey不能进行相应的接收,如果确实需要,须继续扩充GetKey函数。

c语言:鼠标和键盘函数的相关问题

首先最简单的但可以后台处理的有SendMessage()PostMessage()

发送鼠标,

键盘消息,

这个百度一搜n多了

然后中等级的模拟就是keyboard_eventmouse_event了这个比较用的比较多,

给个例子你

模拟键盘点击void

Press(UINT

key)

{

keybd_event(key,MapVirtualKey(key,

0),0,0);

keybd_event(key,MapVirtualKey(key,

0),KEYEVENTF_KEYUP,0);

}

模拟

鼠标左键单击mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

这里注意调用

keyboard_event

的时候一定要用MapVirtualKey

网上大部分的代码都是没用的,

这个函数时获取

硬件扫描码

的先说下keybd_event();函数的参数keybd_event(要模拟按下的虚拟按键码,

虚拟按键码对应的硬件扫描码,0,0);网上的代码大部分都有

虚拟按键码,

当然你运行大部分都是没问题的,

因为对于一般的程序而言是没问题的但有的程序为了防止

外挂

或者

防止其他程序恶意修改什么的,会对

鼠标键盘

消息进行检测,

如果检测到没有硬件扫描码会拒绝执行的

然后还有比较高级的就是SendInput模拟了void

OnSendCharCode(unsigned

short

unicode

=

0,unsigned

short

vcode

=

0,bool

bDown

=

false,bool

bUnicode

=

true);

void

OnSendCharCode(unsigned

short

unicode,unsigned

short

vcode,bool

bDown,bool

bUnicode)

{

unsigned

short

uNum

=

0;

//

v-code

Clicked

INPUT

事件设定

KEYBDINPUT

kDown;

KEYBDINPUT

kUp;

if(!bUnicode)

{

//

'A';

(Virtual

Code

只有大写),

要输入小写

//

Enter:

13,

Backspace:

8,

Up:38

kDown.wVk

=

kUp.wVk

=

vcode;

kDown.wScan

=

kUp.wScan

=

::MapVirtualKey(kDown.wVk,0);

//kDown.dwFlags

=

KEYEVENTF_EXTENDEDKEY;

kUp.dwFlags

=

KEYEVENTF_KEYUP;

}else{

kDown.wVk

=

kUp.wVk

=

0;

kDown.wScan

=

kUp.wScan

=

unicode;

kDown.dwFlags

=

KEYEVENTF_UNICODE;

kUp.dwFlags

=

KEYEVENTF_UNICODE

|

KEYEVENTF_KEYUP;

}

//

建立

KeyDown

事件

建立

KeyUP

事件

INPUT

inputKeyDown,

inputKeyUP;

inputKeyDown.type

=

inputKeyUP.type

=

INPUT_KEYBOARD;

//

指定

input

keyboard

kDown.time

=

kUp.time

=

0;

//

the

system

will

provide

its

own

time

stamp.

kDown.dwExtraInfo

=

kUp.dwExtraInfo

=

(WORD)::GetMessageExtraInfo();

inputKeyDown.ki

=

kDown;//

指定

键盘

属性结构

inputKeyUP.ki

=

kUp;

//

指定

键盘

属性结构

//

v-code

Clicked

INPUT

事件设定完成

//

INPUT

事件送到

Root

视窗,

系统会根据视窗位置,送给目标视窗

if(bDown)

{

INPUT

event[1]

=

{inputKeyDown};

uNum

=

::SendInput(1,event,

sizeof(INPUT));

}else{

INPUT

event[2]

=

{inputKeyDown,inputKeyUP};

uNum

=

::SendInput(2,event,

sizeof(INPUT));

}

}

//例子:

OnSendCharCode(0,VK_SHIFT,true,false);

OnSendCharCode(0,'A',false,false);

OnSendCharCode(0,VK_SHIFT,false,false);

OnSendCharCode(0,'A',false,false);

//KEYEVENTF_UNICODE

能区分大小写

OnSendCharCode('A');

OnSendCharCode('a');

不过还是有很多游戏,它是用

DirectX

技术去做的,这些大部分对他们没用所以还有最最最高级的模拟,

就是

对硬件驱动程序的模拟这个有个外国人写的

winio.h

的头文件,

有兴趣可以去学,

一般用不到的,

C语言矩阵键盘函数疑问

看程序中P1.0-P1.3是行扫描输出,P1.4-P1.7是扫描输入。所以原理是P1.0-P1.3中每次只有一个引脚输出0,其余输出1,然后读取P1.4-P1.7是否有引脚为0;如果有0说明有按键按下,如果全1说明没有按键按下。

scancode这个变量就是用于控制P1.0-P1.3(P1 = scancode;由这句输出)中每次只有一个引脚输出0的。

scancode = 0xfe;这句中bit0值为0,其余bit为1,所以开始时,P1 = scancode;由这句输出后,P1.0为0,其余引脚为1。

scancode = (scancode  1) | 0x01;这句使为0的bit左移一位(依次值为0xFE, 0xFD, 0xFB, 0xF7, 0xEF)。0xFE, 0xFD, 0xFB, 0xF7都满足while ((scancode 0x10) != 0)这个条件,而0xEF则不满足了,所以说此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了,到这就所有按键都扫描过了,没有按键按下(如果有按键按下,中途就返回了)。

if ((P1 0xf0) != 0xf0)这句中P1 0xf0表示只判断P1.4-P1.7,只有当前按下的按键所在行扫描输出为0时,这个表达式才成立(这时(P1 0xf0) != 0xf0);否则这个表达式肯定不成立(这时(P1 0xf0) == 0xf0),所以说当前行。

return ((~scancode) + (~tmpcode));这句就是如果有按键按下,那么直接返回键值,并不再进行循环退出程序。

程序格式要注意,下面这样更清楚:

uchar keyscan(void)

{

uchar scancode, tmpcode;

P1 = 0xf0; // 发全0行扫描码

if ((P1 0xf0) != 0xf0)

// 若有键按下

{

delay(); // 延时去抖动

if ((P1 0xf0) != 0xf0)

// 延时后再判断一次,去除抖动影响

{

scancode = 0xfe;

while ((scancode 0x10) != 0)

// 逐行扫描此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了

{

P1 = scancode; // 输出行扫描码

if ((P1 0xf0) != 0xf0)

// 本行有键按下为什么是行?哪一列按下此句都成立啊

{

tmpcode = (P1 0xf0) | 0x0f;

/* 返回特征字节码,为1的位即对应于行和列 */

return ((~scancode) + (~tmpcode));

}

else

scancode = (scancode  1) | 0x01;

// 行扫描码左移一位

}

}

}

return (0); // 无键按下,返回值为0

}

C语言 如何在一段时间内检测键盘是否按下

C语言实现的键盘检测:

/*

检测当前是否有键盘输入,并更新键值JR_KeyValue

*/

int

JR_AnyKeys(void);

/*

返回键值ASCII码

对应自定义键值

*/

int

JR_GetKeyNum(void);

/*

检测指定键是否有按下

*/

int

JR_IsKeyDown(const

int

key);

BUG:在一次检测中多次调用函数JR_GetKeyNum()就会出错了。

FIX:把JR_KeyBoard.c文件中的JR_GetKeyNum()函数里面的第一句“JR_AnyKeys();”注释掉就可以了。

C语言 如何在一段时间内检测键盘是否按下

#include bios.h

#include stdio.h

main()

{

int key;

for(;;)

{

if (bioskey(1)) /*有键按下,读取键值*/

key=bioskey(0);

else /*无键按下,返回0*/

key=0;

switch(key)

{case 0: ...../*无按键,执行该操作*/

case 0xXXXXH:..../*不同键值,做不同处理*/

。。。。。

}

}

}

该程序段功能:

判断是否有键按下,若有进行不同操作,若无进行其他操作。

相关原理:

函数名: bioskey

功 能: 直接使用BIOS服务的键盘接口

函数原型:int bioskey (int cmd)

说明:bioskey()的函数原型在bios.h中

bioskey()完成直接键盘操作,cmd的值决定执行什么操作。

cmd = 1:

当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。

键盘有按键时,会把键值(扫描码)存入缓冲区,当需要判断是否有键按下时,扫描缓冲区,为空则无键按下,不为空则有键按下。注意:该功能并不清空缓冲区。

cmd = 0:

当cmd是0,bioskey()返回键盘键入的值。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码,高8位存放该键的扫描码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。

其操作步骤为:

1.检测缓冲区是否有数据;

2.没有则继续第一步;

3.读取缓冲区第一个单元中的键盘输入

4.读取的扫描码

5.将已读取的键盘输入从缓冲区删除


本文标题:c语言中的键盘检测函数 c语言中的键盘检测函数是什么
网页链接:http://chengdu.cdxwcx.cn/article/hjhipe.html