网站建设资讯

NEWS

网站建设资讯

c语言键盘检测函数 c语言检测键盘是否有输入

C语言如何检测点击的按钮?

通常很多情况下,会有这样的事情,就是:

在河津等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站制作、成都网站建设 网站设计制作按需制作,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,外贸网站制作,河津网站建设费用合理。

我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限。某个按钮才允许点击。

其实所有的这些东西都是 别的人或者公司利用一些编程语言调用windows的函数,实现的。所以如果我们也能调用windows的函数,那么我们就能够执行一些按钮或者某些东西背后的函数。

自己的mfc还暂时 用不了,不过 可以 试试这个。

调出这个界面,看到有一个置灰的设置按钮。我们可以试着调用这个后面的函数。

/*如何调出来?【在win7环境下】

打开控制面板

点击鼠标。*/

然后利用vs的工具中的spy++ x64。

进入查找窗口。

拖住这个到刚刚鼠标的那个置灰的按钮上面。就可以得到一个句柄。

句柄【在我理解,就是一个话把子,怎么解释,就是,别人说一件事儿,你得顺着往下说才能把话接下来,然后完成你想说的东西。在程序里面,执行到这里,有这样一个句柄,允许我们说话了,我们就从这一点开始,顺着往下说,往往就能得到我们想要的结果】

所以得到了句柄之后。我们可以新建一个工程。

#include windows.h

int main(){

SendMessage(0x001607E6,WM_LBUTTONDOWN,0,0);

SendMessage(0x001607E6,WM_LBUTTONUP,0,0);

return 0;

}

//在HWND的第一个参数里面输入刚刚的句柄。

//猜测 第二个参数 是 WindowManager_LeftButtonDown,就是窗口管理器左键按钮点下。

//然后左键按钮弹起。

就强制的往刚刚不能执行的函数里面发送了一个信息。前面的引文介绍说,这就是调用了windows底层的一些函数,如果按钮可以点击,则鼠标点击,按钮按下,当需要注册的时候,或者需要序列号的时候我们并没有,就不能点击。但是当我们给他发送一条消息以后,是不是问题就解决了。

在c语言中什么函数能实现识别键盘上的按键?

添加WM_KEYDOWN函数。在函数体中case WM_KEYDOWN: if (wParam==VK_LEFT)//方向键左 { rect1.left-=10; rect1.right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_RIGHT)//方向键右 { rect1.left+=10; rect1.right+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_UP)//方向键上 { rect1.top-=10; rect1.bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_DOWN)//方向键下 { rect1.top+=10; rect1.bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_PRIOR)//PG UP { rect1.top-=10; rect1.bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_NEXT)//PG DN { rect1.top+=10; rect1.bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_HOME)//HOME { rect1.left-=10; rect1.right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_END)//END { rect1.left+=10; rect1.right+=10; InvalidateRect (hWnd,NULL,TRUE); } break;

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语言:鼠标和键盘函数的相关问题

首先最简单的但可以后台处理的有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语言怎样判断键盘按键的按下、释放?

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语言编写键盘监控器方法

键控程序简单事例:#include string.h

#include conio.h

#include stdlib.h

#include dos.h

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

/*======== ALL VAR==============*/

int bleft=10;

int width=52;

int height=20;

/*=========About Location===========*/

typedef struct

{

int x, y;

int xv, yv;

}Location;/*=============About Welcome=============*/

void menu()

{ printf(" welcom to coming\n");

printf(" =======================================================\n");

printf(" ! In the game please press ESc to quit! !\n");

printf(" ! Enter the game?(Y/N) !\n");

printf(" =======================================================\n");

}

/*=========About border==========*/

void bianjie()

{

int i;

for(i=0;ibleft;i++)

printf(" ");

for(i=0;iwidth;i++)

{ printf("=");

}

for(i=0;iheight;i++)

{ gotoxy(bleft,i);

printf("!");

}

for(i=0;iheight;i++)

{ gotoxy(width+bleft,i);

printf("!");

}

for(i=1;iwidth;i++)

{ gotoxy(bleft+i,height-1);

printf("=");

}

}

/*==========About pro things===========

void things()

{

}*/

/*===========About Oprtion=============*/

void zhixing()

{

int i,key;

Location shili;

shili.x=bleft+1;

shili.y=1;

shili.xv=5;

shili.yv=5;

while(1)

{

key=bioskey(0);

if(key==ESC)/**/

break;

else if(key==UP)

{

for(i=0;ishili.yv;i++)

{

if(shili.y-shili.yv1)

{

shili.y--;

gotoxy(shili.x,shili.y+1);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else {

if(shili.y1)

{

shili.y--;

gotoxy(shili.x,shili.y+1);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else { shili.y++;

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

gotoxy(shili.x,shili.y-1);

printf(" ");

}

}

}

}

else if(key==DOWN)

{

for(i=0;ishili.yv;i++)

{

if(shili.y+shili.yvheight)

{

shili.y++;

gotoxy(shili.x,shili.y-1);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else {

if(shili.yheight)

{

shili.y++;

gotoxy(shili.x,shili.y-1);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else { shili.y--;

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

gotoxy(shili.x,shili.y+1);

printf(" ");

}

}

}

}

else if(key==LEFT)

{

for(i=0;ishili.xv;i++)

{

if(shili.x-shili.xvbleft)

{

shili.x--;

gotoxy(shili.x+1,shili.y);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else {

if(shili.xbleft)

{

shili.x--;

gotoxy(shili.x+1,shili.y);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else { shili.x++;

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

gotoxy(shili.x-1,shili.y);

printf(" ");

}

}

}

}

else if(key==RIGHT)

{

for(i=0;ishili.xv;i++)

{

if(shili.x+shili.xvwidth+bleft)

{

shili.x++;

gotoxy(shili.x-1,shili.y);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else {

if(shili.xwidth+bleft)

{

shili.x++;

gotoxy(shili.x-1,shili.y);

printf(" ");

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

}

else { shili.x--;

gotoxy(shili.x,shili.y);

printf("%c\b", 2);

gotoxy(shili.x+1,shili.y);

printf(" ");

}

}

}

}

}}

/**********************************/

void main()

{ char ch;

clrscr();

menu();

ch=getch();

if(ch=='N'||ch=='n')

return;

else if(ch=='Y'||ch=='y')

{ clrscr();

bianjie();

zhixing();

}

}C语言获取键值函数事例:/*函数名称: bioskey

函数原型: int bioskey(int cmd)

函数功能: 读取键盘值

函数返回: cmd=0:返回一个键盘值(ascii值放在低位,扫描码放在高位),若无按键,一直等

cmd=1:查询键盘是否按下:0-无键按下,非0-有键按下

cmd=2:返回控制键状态,返回值保存在低8位中

0-右边的shift键按下 5-已打开Scroll_Lock

1-左边的shift键按下 6-已打开Num_Lock

3-Ctrl键按下 7-已打开Caps_Lock

4-Alt键按下 8-已打开Insert

参数说明:

所属文件: bios.h*/

#include stdio.h

#include bios.h

#include ctype.h

int main()

{

int key, shift;

int lastshift;

while (1)

{

shift=bioskey(2);

if(shift!=lastshift)

printf("Shift=0x% 02x\n",shift);

if(bioskey(1))

{

key=bioskey(0);

if((key0xFF)=='q')

break;

printf("Key=0x% 04x",key);

}

lastshift=shift;

}

return 0;

}文件存在性判断事例:#include stdio.h

#include io.h

int file_exists(char *filename);

int main()

{

printf("Does myfile.FIL exist: %s",file_exists("myfile.FIL") ? "YES" : "NO");

getch();

return 0;

}

int file_exists(char *filename)

{

return (access(filename,0)==0);

} 如还有疑问,请追加!


本文标题:c语言键盘检测函数 c语言检测键盘是否有输入
网页地址:http://cdweb.net/article/hhhpcj.html