您的位置:澳门正规赌博十大网站 > 编程应用 > C语言编制程序学习

C语言编制程序学习

发布时间:2019-10-04 22:46编辑:编程应用浏览(61)

    C语言是面向过程的,而C++是面向对象的

     GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别:

    C和C++的区别:

    1、BOOL GetKeyboardState( PBYTE lpKeyState );获得所有的256个键(键盘按键、鼠标按键等等)的状态,lpKeyState是指向一个256bit的数组,存放所有键的状态。

    C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理得到输出控制)。

    2、SHORT GetAsyncKeyState( int vKey );判断Virtual-KeyCodes为vKey的键是否down或up。用返回值的最高位表示键的状态(up或down),用返回值的最低位表示vKey键在此函数调用之前是否被按下过。GetAsyncKeyState直接侦测键盘的硬件中断。

    C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

    3、SHORT GetKeyState( int nVirtKey );用于判断nVirtKey的状态。用返回值的最高位表示,最高位为1表示当前键处于down的状态;最高位为0当前键处于up状态。此函数从消息队列中读取消息进行处理。

    C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

        下面是转载的内容:

    图片 1

    0x8000 & GetKeyState(VK_SHIFT); 这句是判断是否有按下shift键 

    介绍:

    为什么GetAsyncKeyState()& 

    鼠标连点器就是用来代替你的手在电脑上不停的点击电脑,介绍完毕!

    首先说明,有好多程序或书上是0x8000f,这个f不是十六进制的f而是代表浮点数。其实& 8000才是本质。整理后自己写了点东西,总结一下 

    有什么用?

    首先介绍一下几个概念: 
    按位与运算符"&":是双目运算符,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:0x11 & 0x12(即0001 0001 & 0001 0010)的结果是0x10(0001 0000);(关于vs取反参考附) 
    虚键:指的是非字母可以明确表示的键.(例如ESC BS TAB NumLock 等,虚键列表见附); 
    物理键状态:在操作系统的控制面板中设置鼠标左右键的映射(实际的鼠标左键可以映射成右键点击事件),或者通过程序也可以这样设置,这样就产生了(实际的)物理键状态; 
    逻辑键状态:使用 GetKeyState,GetKeyboardState,等函数得到的逻辑键状态,模拟按下按键; 
    GetAsyncKeyState函数功能:读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。MSDN上给出了例子很恰当For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button.也就是说如果你重新设置了映射,GetAsyncKeyState还是只读取物理状态; 
    GetAsyncKeyState的返回值:表示两个内容,一个是最高位bit的值,代表这个键是否被按下,按下为1,抬起为0;一个是最低位bit的值,在windowsCE下要忽略(参考自MSDNIf the most significant bit is set, the key is down. The least significant bit is not valid in Windows CE, and should be ignored.) 
    Asynchronous:英文意思是异步的 

    爱打游戏吗?喜欢刷等级的同学收藏了,睡一觉就满级了。让他自己在电脑上不停的点点点。

    实际当中GetAsyncKeyState的返回值是什么呢?小鱼我写了个程序来获取返回值: 
    #include <Windows.h> 
    #include <stdio.h> 

    我系渣渣辉,挂机一整晚……

    void main() 

    while(1) 

    short a = ::GetAsyncKeyState(VK_LSHIFT) 
    printf( "0x%x",a); 
    sleep(10); 


    当然,用MessageBox可以这样写: 
    if(short a = ::GetAsyncKeyState(VK_LSHIFT)) 

    char buffer[30]; 
    sprintf(buffer, "0x%x",a); 
    MessageBox(0, buffer, "a的值", MB_OK); 

    2.在工作学习中,你是不是有许多网上的东西要学,是你必须学的,其实就是你要不停的点点点,

    GetAsyncKeyState按键不按或抬起后不按的返回值0x0        即0000 0000 0000 0000 0000 0000 0000 0000 
    GetAsyncKeyState按键被按下后的返回值    返回0xffff8001 即1111 1111 1111 1111 1000 0000 0000 0001   (这里并不是返回4字节,而是%x打印出32位,前十六位补f) 
    0x8000 即0000 0000 0000 0000 1000 0000 0000 0000 
    GetAsyncKeyState(VK_LSHIFT) & 0x8000    返回0x1          即0000 0000 0000 0000 1000 0000 0000 0000 

    这个时候它的作用就不用我说了吧,专治各种网上挂时长。

    那么为什么GetAsyncKeyState要 ‘与’上 0x8000这个常数呢? 
    答案是:获取按键状态,屏蔽掉其他的可能状态,按照MSDN上说低位should ignore。 
    网上有人这样写,意思很明确: 
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
    #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

    3.看过直播的都知道,有些给主播送礼物的土豪为了表达心意,送上几千甚至几万的礼物,这时候就要不停的点击屏幕,不能停下来,不然礼物的特效就会终断,鼠标连点器的作用有点强大啊。

    程序应该是: 
    if(GetAsyncKeyState(VK_LSHIFT)&&0x8000) 
    对于虚键而言下面这样写逻辑是不对的,虽然结果一样: 
    if(GetAsyncKeyState(VK_LSHIFT)) 

    图片 2

    所以让键盘的"上下左右"出发事件可以这样写: 
    if( ::GetAsyncKeyState(VK_LEFT) & 0x8000 ) 
    code... 
    if( ::GetAsyncKeyState(VK_RIGHT)& 0x8000 ) 
    code... 
    if( ::GetAsyncKeyState(VK_UP) & 0x8000 ) 
    code... 
    if( ::GetAsyncKeyState(VK_DOWN) & 0x8000 ) 
    code... 

    小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    关于GetAsyncKeyState与GetKeyState区别: 
    GetAsyncKeyState上面已经讲差不多了,关于GetAsyncKeyState与GetKeyState二者最大区别:GetAsyncKeyState在按键不按的情况下为0,而GetKeyState在按键不按的情况下开始为0,当一次‘按下抬起’后变为1,依次循环。 

    功能与原理

    SHORT GetKeyState(int nVirtKey   // virtual-key code); 
    作用:返回键的状态,按下、释放或锁定(down、up or toggled) 
    参数:虚拟键代码(VK_)。如果是字母a-z、A-Z 或数字0-9, 则为其对应的ASCII码(比如字母O的ASCII码为十六进制的0x4F) 
    返回值:返回码的高位显示当前是否有键被按下,低位(0位)则显示NumLock、CapsLock、ScrollLock的状态(ON或OFF,为ON时键盘指示灯亮)。即高位为1,返回值小于0,说明有键按下;最低位为1表示处于锁定(ON)状态(参考MSDN:If the high-order bit is 1, the key is down; otherwise, it is up. 
    If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled. ) 
    注:此函数不应该在键盘消息处理程序以外使用,因为它返回的信息只有在键盘消息从消息队列中被检索到之后才有效。若确实需要,请使用GetAsyncKeyState 

    功能:仅限鼠标左键,点击频率0.01-1000次/秒,(个人觉得点击速度太低和太高都用不上),点击次数可选,点击位置可以锁定,支持重复上一次的运行设定。

    ---------------------------------------- 
    网上还找到了一些资料: 

    原理:

    关于和其他的几个函数的区别: 
    SHORT GetKeyState(int nVirtKey); 
    SHORT GetAsyncKeyState(int vKey); 
    BOOL GetKeyboardState(PBYTE lpKeyState); 

    引入头文件 windows.h ,调用几个API

    三个取key status的函数的最大区别是: 
    第一个:是从windows消息队列中取得键盘消息,返回key status. 
    第二个:是直接侦测键盘的硬件中断,返回key status. 
    第三个:是当从windows消息队列中移除键盘消息时,才返回key status. 

    1.GetAsyncKeyState 获取键盘信息,判断某个键是否按下,使得程序无论处于什么状态都能响应

    keybd_event函数,是模拟键盘击键,一次完整的击键模拟事件,是"按下"和"弹起"两个消息,所以 keybd_event(VK_F12,0,0,0);keybd_event(VK_F12,0,KEYEVENTF_KEYUP,0); 完成了一次完整的点击 F12 的事件。 

    2.mouse_event 模拟鼠标的点击

    GetAsyncKeyState()函数,是直接侦测键盘的硬件中断。(有些人说,是一种“实时性”的侦测,这种说法,感觉不对,比如你调用 Sleep(),就算是中断一年的时间,只要在这期间程序还在运行,它都可以把那个键的状态侦测出来)。自上一次调用GetAsyncKeyState()函数以来(在某些循环中,N次调用GetAsyncKeyState(),它每次检查的,都是自上次调用之后,键的状态),若键已被按过,则返回1,否则,返回0;有些资料显示:倘若输入焦点从属于与调用函数的输入线程不同的另一个线程,则返回零(例如,在另一个程序拥有输入焦点时,应该返回零)。实验证明,这种说法并不完全,函数实际是在大部份范围内工作的,只有少数是另外)。 

    3.GetCursorPos 获取鼠标当前的位置

    --------------- 
    附: 
    VC++编译器,计算~10,得出的结果是-11。为什么不是5呢 

    4.SetCursorPos 将鼠标移动到指定位置

    10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11? 

    图片 3

    VC是32位编译器,所以 

    代码

    10 = 00000000 00000000 00000000   00001010 

    #include

    ~10 = 11111111 11111111   11111111   11110101 =   -11 

    #include

    可以通过掩码(位与) 与15位与 

    #include

    15 = 00000000 00000000 00000000   00001111 

    POINT curpos;//鼠标的位置

    ~10 = 00000000 00000000 00000000   00000101   =   -11 
    附: 
    VK_LBUTTON             鼠标左键                      0x01 
    VK_RBUTTON             鼠标右键                      0x02 
    VK_CANCEL              Ctrl + Break                  0x03 
    VK_MBUTTON             鼠标中键                      0x04 

    float i;//点击速度

    VK_BACK                Backspace 键       0x08 
    VK_TAB                 Tab 键                        0x09 

    int j;//点击次数

    VK_RETURN              回车键                        0x0D 

    int a=0,b=0;//储存鼠标坐标

    VK_SHIFT               Shift 键                      0x10 
    VK_CONTROL             Ctrl 键                       0x11 
    VK_MENU                Alt 键                 0x12 
    VK_PAUSE               Pause 键                      0x13 
    VK_CAPITAL             Caps Lock 键                  0x14 

    void selectrate;//选择点击速度、次数

    VK_ESCAPE              Esc 键                        0x1B 

    void click(int i,int j);//开始点击

    VK_SPACE               空格键         0x20 
    VK_PRIOR               Page Up 键                    0x21 
    VK_NEXT                Page Down 键                  0x22 
    VK_END                 End 键                        0x23 
    VK_HOME                Home 键                       0x24 
    VK_LEFT                左箭头键                      0x25 
    VK_UP                  上箭头键                      0x26 
    VK_RIGHT               右箭头键                      0x27 
    VK_DOWN                下箭头键                      0x28 
    VK_SNAPSHOT            Print Screen 键               0x2C 
    VK_Insert              Insert 键                     0x2D 
    VK_Delete              Delete 键                     0x2E 

    int main()

    '0' – '9'             数字 0 - 9                    0x30 - 0x39 
    'A' – 'Z'             字母 A - Z                    0x41 - 0x5A 

    {

    VK_LWIN                左WinKey(104键盘才有)         0x5B 
    VK_RWIN                右WinKey(104键盘才有)         0x5C 
    VK_APPS                AppsKey(104键盘才有)          0x5D 

    system("mode con cols=25 lines=10");//窗口大小

    VK_NUMPAD0            小键盘 0 键                    0x60 
    VK_NUMPAD1            小键盘 1 键                    0x61 
    VK_NUMPAD2            小键盘 2 键                    0x62 
    VK_NUMPAD3            小键盘 3 键                    0x63 
    VK_NUMPAD4            小键盘 4 键                    0x64 
    VK_NUMPAD5            小键盘 5 键                    0x65 
    VK_NUMPAD6            小键盘 6 键                    0x66 
    VK_NUMPAD7            小键盘 7 键                    0x67 
    VK_NUMPAD8            小键盘 8 键                    0x68 
    VK_NUMPAD9            小键盘 9 键                    0x69 

    system("title 源世界.Dracula出品");

    VK_F1 - VK_F24        功能键F1 – F24               0x70 - 0x87 

    //简单说明

    VK_NUMLOCK            Num Lock 键                   0x90 
    VK_SCROLL             Scroll Lock 键                0x91 

    printf("1.这是一个鼠标连点器,操作异常简单。 2.空格键开始,暂停,继续 3.ESC键重新开始 4.点击的位置为鼠标的位置。 5.CTRL键锁定,解锁位置 ");

    while

    {

    printf;

    selectrate();

    system;//清屏

    printf("频率%.2f次/秒 次数%d次 空格键 开始 暂停 继续 ESC键 重新开始 CTRL键 锁定 解锁位置 ",

    1000/i,j);

    click;

    }

    return 0;

    }

    void selectrate

    {

    while

    {

    Sleep;

    if(GetAsyncKeyState)

    {system;

    printf("请输入点击频率 n 次/秒 (0.01< n <=1000) ");

    scanf("%f",&i);

    i=;

    printf("请输入点击次数 x 次 ");

    scanf("%d",&j);

    j=j==0?1000000000:j;//用一个极大的数表示无限

    break;}

    }

    }

    void click(int i,int j)

    {

    while

    {

    if(GetAsyncKeyState)

    {

    int k=j;

    printf;

    while//点击次数

    {

    if(a&&b)SetCursorPos;

    mouse_event(MOUSEEVENTF_LEFTDOWN,curpos.x,curpos.y,0,0);

    mouse_event(MOUSEEVENTF_LEFTUP,curpos.x,curpos.y,0,0);

    Sleep;

    图片 4

    小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    //锁定目标位置

    if(GetAsyncKeyState(VK_CONTROL))

    {

    if(a&&b)

    {a=0;b=0;

    printf;}

    else

    {GetCursorPos(&curpos);

    a=curpos.x;

    b=curpos.y;

    printf("位置锁定 %d %d ",a,b);}

    }

    if(GetAsyncKeyState)

    {

    printf;

    //接收到信号才继续执行

    while

    {

    if(GetAsyncKeyState)

    {printf;

    break;}

    Sleep;

    if(GetAsyncKeyState(VK_ESCAPE))

    {printf;

    return ;}

    }

    }

    if(GetAsyncKeyState(VK_ESCAPE))

    {printf;

    return ;}

    }

    printf("按空格键再来一次 ");

    while

    {

    if(GetAsyncKeyState)

    break;

    Sleep;

    if(GetAsyncKeyState(VK_ESCAPE))

    {printf;

    return ;}

    }

    }

    Sleep;

    }

    }

    效果截图:

    图片 5图片 6

    操作

    按键只有三个,Space键,Ctrl键和Esc键。

    Space键控制开始、暂停、继续。若点击次数有限且点击结束后,按Space键可以重复一轮点击。

    Ctrl键控制位置的锁定和解锁。(仅在点击过程中有效)

    Esc键则是重新开始设定点击频率和次数。

    图片 7

    小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    总结:

    代码简单,主要是判断语句和循环语句,适宜小白借鉴 可修改性强,喜欢的弄个GUI啊,图标啊什么的都行,自定义按键,多点控制也不是问题

    实用,比某些几个M大的软件好多了(就一个鼠标连点器还这么大,怕不是有后门)

    自己写的,看得见摸得着,用的放心。贯彻极简风格,舍弃GUI,代码量100行。

    这些是C/C++能做的

    服务器开发工程师、人工智能、云计算工程师、信息安全、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

    图片 8图片 9图片 10

    本文由澳门正规赌博十大网站发布于编程应用,转载请注明出处:C语言编制程序学习

    关键词: