精华内容
下载资源
问答
  • 传统的汽车方向盘只具备控制转向和喇叭的功能,而随着汽车车身电子的发展,方向盘上正逐渐集成许多用于控制其他功能按键,如控制收音机的按钮、控制DVD或者CD播放的按钮、手机蓝牙免提、自动巡航控制等,甚至还...
  • html 键盘按键与按钮功能关联

    千次阅读 2018-09-05 16:33:49
    键盘中每个按键都对应一个数值,通过匹配进行功能函数得划分,主要使用得是键盘按键事件,onkeydown;案例如下: <!DOCTYPE html> <html > <head> <title&gt...

    键盘中每个按键都对应一个数值,通过匹配进行功能函数得划分,主要使用得是键盘按键事件,onkeydown;案例如下:

    <!DOCTYPE html>
    <html >
    <head>
        <title></title>
    </head>
    <script type="text/javascript">
        function init(){
            //页面键盘点击时触发
            document.onkeydown=showKeyDown;
        }
        function showKeyDown(evt){
            evt = (evt) ? evt : window.event ;
    
            if(evt.keyCode==38){
                fun1(); 
            }
            if(evt.keyCode==40){
                fun2(); 
            }
        }
        function fun1(){
            alert("功能一测试");
        }
        function fun2(){
            alert("功能二测试");
        }
    
    </script>
    <body onload="init()">
        <div align="center">
            <p>说明:键盘"上"为功能一测试</p>
            <p>键盘"下"为功能二测试</p>
            <button onclick="fun1()">功能一测试</button>
            <button onclick="fun2()">功能二测试</button>
        </div>
    
    </body>
    </html>

    操作结果如图:
    这里写图片描述
    更多可以参考以下博文:
    js键盘按钮keyCode及示例大全:https://www.cnblogs.com/daysme/p/6272570.html
    键盘按钮keyCode大全: https://www.cnblogs.com/shyy/archive/2012/04/09/2453029.html

    展开全文
  • 模拟键盘按键

    千次阅读 2018-11-15 10:29:35
    模拟键盘按键

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    原文地址:http://www.cnblogs.com/Jnshushi99/archive/2011/09/03.html



    以前就想过如何模拟键盘按键向其他程序发送控制命令,但总是无功而返,这次也不例外。
    模拟按键的方法很多,如PostMessage(不能用SendMessage),SendInput,keybd_event。
    但最要命的是以上方法基本上都要窗口获取焦点时才有效。也就是想后台模拟键盘按键难度
    是很高的。

    当然有些特殊情况。
    一、模拟单个按键,如按下键A
    用::PostMessage(hWnd,WM_KEYDOWN,'A',0); 在一般情况下可以,即使目标程序在后台运行也可以。
    但正如你等下在下面看到的文章所说,在某些程序里第四个参数需要特别注意,否则发送按键将无效。

    二、模拟ALT+'A'
    向后台程序发送组合键ALT+按键 是可行的。记住,只可以是ALT,不能是Ctrl或Shift
    操作如下:发送ALT+'A'
    ::PostMessage(hWnd,WM_SYSKEYDOWN,'A',1<<29);

    三、我现在的做法只能是激活目标窗口使其成为前台窗口后再模拟发送组合按键,如下:
    但这个方法有时也不行,因为SetForegroundWindow有时会无法激活窗口
    SetForegroundWindow(g_OperaWnd);
    keybd_event(VK_CONTROL,0,0,0);
    keybd_event(65,0,0,0);
    keybd_event(65,0,KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

    四、模拟鼠标的行为最好用SendMessage(不要用PostMessage),这样可以把消息直接发送
    到目的窗口的窗口处理过程。成功率会高很多。
    ::SendMessage(GetWnd(),WM_LBUTTONDOWN,NULL,MAKELPARAM(47,11));
    ::SendMessage(GetWnd(),WM_LBUTTONUP,NULL,MAKELPARAM(40,65));
    ::SendMessage(GetWnd(),WM_MOUSEMOVE,NULL,MAKELPARAM(40,65));


    五、按以下文章所说的,我们不能用PostMessage模拟键盘组合键
    http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx


    ━━━━━━━━━━━━━━━━━━━━━━━━
    六、以下是一些网上的资料,供大家参考:

    WM_KEYDOWN:

    0-15位:指定当前消息的重复次数。其值就是用户按下该键后自动重复的次数,但是重复次数不累积
    16-23位:指定其扫描码,其值依赖于OEM厂商
    24位:指定该按键是否为扩展按键,所谓扩展按键就是Ctrl,Alt之类的,如果是扩展按键,其值为1,否则为0
    25-28位:保留字段,暂时不可用
    29位:指定按键时的上下文,其值为1时表示在按键时Alt键被按下,其值为0表示WM_SYSKEYDOWN消息因没有任何窗口有键盘焦点而被发送到当前活动窗口。
    30位:指定该按键之前的状态,其值为1时表示该消息发送前,该按键是被按下的,其值为0表示该消息发送前该按键是抬起的。
    31位:指定其转换状态,对WM_SYSKEYDOWN消息而言,其值总为0。


    Param资讯
      在四个按键讯息(WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP)中,wParam讯息参数含有上面
    所讨论的虚拟键码,而lParam讯息参数则含有对了解按键非常有用的其他资讯。lParam的32位分为6个栏位,
    如图所示。在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。因为地址通常是32位的,
    所以LPARAM被用来传递地址,这个习惯在Win32 API中仍然能够看到。在Win32 API中,WPARAM和LPARAM都是32位,
    所以没有什么本质的区别。Windows的消息必须参考帮助文件才能知道具体的含义。如果是你定义的消息,
    愿意怎么使这两个参数都行。但是习惯上,我们愿意使用LPARAM传递地址,而WPARAM传递其他参数。


    ━━━━━━━━━━━━━━━━━━━━━━━━

    PostMessage模拟后台按键第四参数的初次探究
      最近做游戏挂机的时候,遇到一个问题。PostMessage可以很方便地后台按键,可是第四个参数却随着第三个参数(按键代码,或称虚拟键码)的改变而改变。在普通的程序中,第四个参数赋予零就可以实现按键,但是在游戏中是不行的(可能是游戏会检测吧,个人猜测)
      于是我到 MSDN 上查找相关资料。

      lParam
      The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown following.
    Bits Meaning
    0-15 The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
    16-23 The scan code. The value depends on the OEM.
    24 Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
    25-28 Reserved; do not use.
    29 The context code. The value is always 0 for a WM_KEYDOWN message.
    30 The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
    31 The transition state. The value is always 0 for a WM_KEYDOWN message.
      来源:http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx

      原来 lParam 有特殊的含义,其第0~15位是表示键重复的次数,第16~23位是键的 Scan Code,组合键需要设置第24位。看来问题是在第16~23位的 Scan Code 上了。怎么获取这个 Scan Code 呢?其实很容易,微软给我们提供了一个 API:MapVirtualKey。
      在易语言中的声明格式:
      
    复制代码

    .DLL命令 MapVirtualKey, 整数型, "user32.dll", "MapVirtualKeyA"
    .参数 uCode, 整数型
    .参数 uMapType, 整数型

      知道了道理就好办了,第一个参数无疑是键代码,第二个参数是什么?查下 MSDN。

      uMapType [in] UINT
      The translation to be performed. The value of this parameter depends on the value of the uCode parameter.
    Value Meaning
    MAPVK_VK_TO_CHAR
    2 uCode is a virtual-key code and is translated into an unshifted character value in the low-order word of the return value. Dead keys (diacritics) are indicated by setting the top bit of the return value. If there is no translation, the function returns 0.
    MAPVK_VK_TO_VSC
    0 uCode is a virtual-key code and is translated into a scan code. If it is a virtual-key code that does not distinguish between left- and right-hand keys, the left-hand scan code is returned. If there is no translation, the function returns 0.
    MAPVK_VSC_TO_VK
    1 uCode is a scan code and is translated into a virtual-key code that does not distinguish between left- and right-hand keys. If there is no translation, the function returns 0.
    MAPVK_VSC_TO_VK_EX
    3 uCode is a scan code and is translated into a virtual-key code that distinguishes between left- and right-hand keys. If there is no translation, the function returns 0.
      来源:http://msdn.microsoft.com/en-us/library/ms646306%28VS.85%29.aspx
      我们需要的是 MAP_VK_VK_TO_VSC (即0)。下面的事情就好办了。我们先通过这个 API 获取到 Scan Code,然后 左移16位,再加上1,得到 lParam,PostMessage WM_KEYDOWN、WM_KEYUP 即可。
      源码就不带了,懂者自懂,不懂的源码上了也没用。



    ━━━━━━━━━━━━━━━━━━━━━━━━
    VB PostMessage 向Windows窗口发送Alt组合键2008-04-30 01:40关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多,
    但就是没有很好解决问题。
    之前找到一个能正确发送的code:(Alt+A)

    PostMessage(hWnd,WM_SYSKEYDOWN,VK_MENU,0);
    PostMessage(hWnd,WM_SYSKEYDOWN,0x41,0);
    Sleep(50);
    PostMessage(hWnd,WM_SYSKEYUP,0x41,0);
    PostMessage(hWnd,WM_SYSKEYUP,VK_MENU,0);

    有人解释说,按下组合键的时候系统是发两条消息的
    但是看到Win32 SDK,感觉上就发一次就可以了……
    偶然间又看到最后一个参数的说明,有所发现!先看WM_SYSKEYDOWN的help
    The WM_SYSKEYDOWN message is posted to the window with the keyboard focus when the user holds down the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that receives the message can distinguish between these two contexts by checking the context code in the lKeyData parameter.

    WM_SYSKEYDOWN
    nVirtKey = (int) wParam; // virtual-key code
    lKeyData = lParam; // key data
    Parameters
    nVirtKey
    Value of wParam. Specifies the virtual-key code of the key being pressed.
    lKeyData
    Value of lParam. Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table:
    Value Description
    0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.
    16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
    24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
    25-28 Reserved; do not use.
    29 Specifies the context code. The value is 1 if the ALT key is down while the key is pressed; it is 0 if the WM_SYSKEYDOWN message is posted to the active window because no window has the keyboard focus.
    30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.
    31 Specifies the transition state. The value is always 0 for a WM_SYSKEYDOWN message.

    之前曾经修改过keyData的16-23位为VK_MENU,第30位参数为1,但没效果
    请看位29的说明!!
    The value is 1 if the ALT key is down while the key is pressed;
    当值为1时表示ALT键被按下!这不正是我需要的吗?于是把29位设置为1,函数调用变成
    PostMessage(hWnd,WM_SYSKEYDOWN,0x41,1<<29);
    经过测试,发现这个就是Alt+A的效果!!原来这么简单,但为什么很多人弄得那么复杂,我当时查找的时候也是迷惘啊,浪费了N多小时。
    类似有个WM_SYSKEYUP,WM_SYSCHAR(这个不知道干什么用)


    ━━━━━━━━━━━━━━━━━━━━━━━━

    这年头,在这个论坛里面已经没有什么技术贴了...呵呵~发一篇惊天地,泣鬼神的帖子.当然这个只是模拟键盘的终极模拟.呵呵~
    键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
    当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。当你按下一个键时,这个键的扫描码就被传给系统。扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。这个过程可以简单的如下表示:
    用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口
    明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。

    1.局部级模拟

    从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和 PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    参数hwnd 是你要发送消息的目标程序上某个控件的句柄,参数wMsg 是消息的类型,表示你要发送什么样的消息,最后wParam 和lParam 这两个参数是随消息附加的数据,具体内容要由消息决定。
    再来看看wMsg 这个参数,要模拟按键就靠这个了。键盘消息常用的有如下几个:
    WM_KEYDOWN 表示一个普通键被按下
    WM_KEYUP 表示一个普通键被释放
    WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
    WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
    如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如下:
    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    参数wCode 表示待转换的码,参数wMapType 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType 设置为0,如果是虚拟扫描码转虚拟码,则wMapType 设置为1,如果是虚拟码转ASCII码,则wMapType 设置为2.相信有了这些,我们就可以构造键盘事件的lParam参数了。下面给出一个构造lParam参数的函数:
    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

    Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
    '参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
    Dim s As String
    Dim Firstbyte As String 'lparam参数的24-31位
    If flag = WM_KEYDOWN Then '如果是按下键
    Firstbyte = "00"
    Else
    Firstbyte = "C0" '如果是释放键
    End If
    Dim Scancode As Long
    '获得键的扫描码
    Scancode = MapVirtualKey(VirtualKey, 0)
    Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码
    Secondbyte = Right("00" & Hex(Scancode), 2)
    s = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息
    MakeKeyLparam = Val("&H" & s)
    End Function

    这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。
    好了,做完以上的事情,现在我们可以向目标程序发送键盘消息了。首先取得目标程序接受这个消息的控件的句柄,比如目标句柄是12345,那么我们来对目标模拟按下并释放A键,像这样:(为了简单起见,lParam这个参数就不构造了,直接传0)
    PostMessage 12345,WM_KEYDOWN,VK_A,0& '按下A键
    PostMessage 12345,WM_UP,VK_A,0& '释放A键
    好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊 ~~~~~~~~~~55555555555555 不是的哦,接着往下看啊。
    一般目标程序都会含有多个控件,并不是每个控件都会对键盘消息作出反应,只有把键盘消息发送给接受它的控件才会得到期望的反应。那记事本来说,它的编辑框其实是个edit类,只有这个控件才对键盘事件有反应,如果只是把消息发给记事本的窗体,那是没有用的。现在你找出记事本那个编辑框的句柄,比如是 54321,那么写如下代码:
    PostMessage 54321,WM_KEYDOWN,VK_F1,0& '按下F1键
    PostMessage 54321,WM_UP,VK_F1,0& '释放F1键
    怎么样,是不是打开了记事本的“帮助”信息?这说明目标程序已经收到了你发的消息,还不错吧~~~~~~~~
    可以马上新问题就来了,你想模拟向记事本按下A这个键,好在记事本里自动输入字符,可是,没有任何反应!这是怎么一回事呢?
    原来,如果要向目标程序发送字符,光靠WM_KEYDOWN和WM_UP这两个事件还不行,还需要一个事件:WM_CHAR,这个消息表示一个字符,程序需靠它看来接受输入的字符。一般只有A,B,C等这样的按键才有WM_CHAR消息,别的键(比如方向键和功能键)是没有这个消息的,WM_CHAR消息一般发生在WM_KEYDOWN消息之后。WM_CHAR消息的lParam参数的含义与其它键盘消息一样,而它的wParam则表示相应字符的 ASCII编码(可以输入中文的哦^_^),现在你可以写出一个完整的向记事本里自动写入字符的程序了,下面是一个例子,并附有这些消息常数的具体值:
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_CHAR = &H102
    Public Const VK_A = &H41

    Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
    Dim s As String
    Dim Firstbyte As String 'lparam参数的24-31位
    If flag = WM_KEYDOWN Then '如果是按下键
    Firstbyte = "00"
    Else
    Firstbyte = "C0" '如果是释放键
    End If
    Dim Scancode As Long
    '获得键的扫描码
    Scancode = MapVirtualKey(VirtualKey, 0)
    Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码
    Secondbyte = Right("00" & Hex(Scancode), 2)
    s = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息
    MakeKeyLparam = Val("&H" & s)
    End Function

    Private Sub Form_Load()
    dim hwnd as long
    hwnd = XXXXXX 'XXXXX表示记事本编辑框的句柄
    PostMessage hwnd,WM_KEYDOWN,VK_A,MakeKeyLparam(VK_A,WM_KEYDOWN) '按下A键
    PostMessage hwnd,WM_CHAR,ASC("A"),MakeKeyLparam(VK_A,WM_KEYDOWN) '输入字符A
    PostMessage hwnd,WM_UP,VK_A,MakeKeyLparam(VK_A,WM_UP) '释放A键
    End Sub

    这就是通过局部键盘消息来模拟按键。这个方法有一个极大的好处,就是:它可以实现后台按键,也就是说他对你的前台操作不会有什么影响。比如,你可以用这个方法做个程序在游戏中模拟按键来不断地执行某些重复的操作,而你则一边喝茶一边与QQ上的MM们聊得火热,它丝毫不会影响你的前台操作。无论目标程序是否获得焦点都没有影响,这就是后台模拟按键的原理啦~~~~


    2.全局级模拟

    你会发现,用上面的方法模拟按键并不是对所有程序都有效的,有的程序啊,你向它发了一大堆消息,可是它却一点反应也没有。这是怎么回事呢?这就要看具体的情况了,有些程序(特别是一些游戏)出于某些原因,会禁止用户对它使用模拟按键程序,这个怎么实现呢?比如可以在程序中检查一下,如果发现自己不是活动窗口,就不接受键盘消息。或者仔细检查一下收到的键盘消息,你会发现真实的按键和模拟的按键消息总是有一些小差别,从这些小差别上,目标程序就能判断出:这是假的!是伪造的!!因此,如果用PostMessage发送局部消息模拟按键不成功的话,你可以试一试全局级的键盘消息,看看能不能骗过目标程序。
    模拟全局键盘消息常见的可以有以下一些方法:
    (1) 用API函数keybd_event,这个函数可以用来模拟一个键盘事件,它的VB声明为:
    Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    参数bVk表示要模拟的按键的虚拟码,bScan表示该按键的扫描码(一般可以传0),dwFlags表示是按下键还是释放键(按下键为0,释放键为2),dwExtraInfo是扩展标志,一般没有用。比如要模拟按下A键,可以这样:
    Const KEYEVENTF_KEYUP = &H2
    keybd_event VK_A, 0, 0, 0 '按下A键
    keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0 '释放A键
    注意有时候按键的速度不要太快,否则会出问题,可以用API函数Sleep来进行延时,声明如下:
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    参数dwMilliseconds表示延时的时间,以毫秒为单位。
    那么如果要模拟按下功能键怎么做呢?比如要按下Ctrl+C实现拷贝这个功能,可以这样:
    keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl键
    keybd_event VK_C, 0, 0, 0 '按下C键
    Sleep 500 '延时500毫秒
    keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '释放C键
    keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '释放Ctrl键
    好了,现在你可以试试是不是可以骗过目标程序了,这个函数对大部分的窗口程序都有效,可是仍然有一部分游戏对它产生的键盘事件熟视无睹,这时候,你就要用上 bScan这个参数了。一般的,bScan都传0,但是如果目标程序是一些DirectX游戏,那么你就需要正确使用这个参数传入扫描码,用了它可以产生正确的硬件事件消息,以被游戏识别。这样的话,就可以写成这样:
    keybd_event VK_A, MapVirtualKey(VK_A, 0), 0, 0 '按下A键
    keybd_event VK_A, MapVirtualKey(VK_A, 0), KEYEVENTF_KEYUP, 0 '释放A键
    以上就是用keybd_event函数来模拟键盘事件。除了这个函数,SendInput函数也可以模拟全局键盘事件。SendInput可以直接把一条消息插入到消息队列中,算是比较底层的了。它的VB声明如下:
    Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
    参数:
    nlnprts:定义plnputs指向的结构的数目。
    plnputs:指向INPUT结构数组的指针。每个结构代表插人到键盘或鼠标输入流中的一个事件。
    cbSize:定义INPUT结构的大小。若cbSize不是INPUT结构的大小,则函数调用失败。
    返回值:函数返回被成功地插人键盘或鼠标输入流中的事件的数目。若要获得更多的错误信息,可以调用GetlastError函数。
    备注:Sendlnput函数将INPUT结构中的事件顺序地插入键盘或鼠标的输入流中。这些事件与用户插入的(用鼠标或键盘)或调用keybd_event,mouse_event,或另外的Sendlnput插人的键盘或鼠标的输入流不兼容。
    嗯,这个函数用起来蛮复杂的,因为它的参数都是指针一类的东西。要用它来模拟键盘输入,先要构造一组数据结构,把你要模拟的键盘消息装进去,然后传给它。为了方便起见,把它做在一个过程里面,要用的时候直接调用好了,代码如下:
    Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
    Type GENERALINPUT
    dwType As Long
    xi(0 To 23) As Byte
    End Type

    Type KEYBDINPUT
    wVk As Integer
    wScan As Integer
    dwFlags As Long
    time As Long
    dwExtraInfo As Long
    End Type

    Const INPUT_KEYBOARD = 1

    Sub MySendKey(bkey As Long)
    '参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
    Dim GInput(0 To 1) As GENERALINPUT
    Dim KInput As KEYBDINPUT
    KInput.wVk = bkey '你要模拟的按键
    KInput.dwFlags = 0 '按下键标志
    GInput(0).dwType = INPUT_KEYBOARD
    CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
    KInput.wVk = bkey
    KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
    GInput(1).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
    CopyMemory GInput(1).xi(0), KInput, Len(KInput)
    '以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中
    SendInput 2, GInput(0), Len(GInput(0)) '把GInput中存放的消息插入到消息列队
    End Sub

    除了以上这些,用全局钩子也可以模拟键盘消息。如果你对windows中消息钩子的用法已经有所了解,那么你可以通过设置一个全局HOOK来模拟键盘消息,比如,你可以用WH_JOURNALPLAYBACK这个钩子来模拟按键。WH_JOURNALPLAYBACK是一个系统级的全局钩子,它和 WH_JOURNALRECORD的功能是相对的,常用它们来记录并回放键盘鼠标操作。WH_JOURNALRECORD钩子用来将键盘鼠标的操作忠实地记录下来,记录下来的信息可以保存到文件中,而WH_JOURNALPLAYBACK则可以重现这些操作。当然亦可以单独使用 WH_JOURNALPLAYBACK来模拟键盘操作。你需要首先声明SetWindowsHookEx函数,它可以用来安装消息钩子:
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long,ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    先安装WH_JOURNALPLAYBACK这个钩子,然后你需要自己写一个钩子函数,在系统调用它时,把你要模拟的事件传递给钩子参数lParam所指向的EVENTMSG区域,就可以达到模拟按键的效果。不过用这个钩子模拟键盘事件有一个副作用,就是它会锁定真实的鼠标键盘,不过如果你就是想在模拟的时候不会受真实键盘操作的干扰,那么用用它倒是个不错的主意。
    3.驱动级模拟

    如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!
    有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。
    在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开 windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
    假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
    OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,&H50 '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
    那么要释放这个键呢?像这样,发送该键的断码:
    OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,(&H50 OR &H80) '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键
    好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的 WINDOWS2000端口操作驱动程序组件(可以到http://www.internals.com/上去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程序),WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工程,添加一个模块,在模块中加入下面的 winio函数声明:

    Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
    Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
    Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
    Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
    Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
    Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
    Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
    Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
    Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
    Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean

    ' ------------------------------------以上是WINIO函数声明-------------------------------------------

    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

    '-----------------------------------以上是WIN32 API函数声明-----------------------------------------

    再添加下面这个过程:
    Sub KBCWait4IBE() '等待键盘缓冲区为空
    Dim dwVal As Long
    Do
    GetPortVal &H64, dwVal, 1
    '这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
    'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
    Loop While (dwVal And &H2)
    End Sub
    上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。
    然后再添加如下过程,这2个过程用来模拟按键:

    Public Const KBC_KEY_CMD = &H64 '键盘命令端口
    Public Const KBC_KEY_DATA = &H60 '键盘数据端口

    Sub MyKeyDown(ByVal vKeyCoad As Long)
    '这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '发送数据前应该先等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键

    End Sub

    Sub MyKeyUp(ByVal vKeyCoad As Long)
    '这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

    End Sub


    定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:


    Private Sub Form_Load()

    If InitializeWinIo = False Then
    '用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
    MsgBox "驱动程序加载失败!"
    Unload Me
    End If
    Timer1.Interval=3000
    Timer1.Enabled=True
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    ShutdownWinIo '程序结束时记得用ShutdownWinIo函数卸载驱动程序
    End Sub

    Private Sub Timer1_Timer()
    Dim VK_A as Long = &H41
    MyKeyDown VK_A
    MyKeyUp VK_A '模拟按下并释放A键
    End Sub

    运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?
    需要注意的问题:
    要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。
    键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:

    The vb code:
    普通浏览复制代码打印代码关于程序
    Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息


    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键


    End Sub


    Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模拟扩展键弹起
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息


    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

    End Sub

    Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息


    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键


    End Sub


    Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模拟扩展键弹起
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)

    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息


    KBCWait4IBE '等待键盘缓冲区为空
    SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
    KBCWait4IBE
    SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

    End Sub

    还应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键,那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程就应该是这样的:
    MyKeyDownEx VK_LEFT '按下左方向键
    Sleep 200 '延时200毫秒
    MyKeyUpEx VK_LEFT '释放左方向键

    Sleep 500
    MyKeyDown VK_SPACE '按下空格键,注意要发送两次
    MyKeyDown VK_SPACE
    Sleep 200
    MyKeyUp VK_SPACE '释放空格键


    好了,相信到这里,你的模拟按键程序也就差不多了,测试一下,是不是很有效呢,嘿嘿~~~~
    WINIO组件
    4.骨灰级模拟
    方法3算是很底层的模拟了,我现在还没有发现有它模拟无效的程序。但是如果你用尽上面所有的方法,仍然无效的话,那么还有最后一个方法,绝对对任何程序都会有效,那就是:把键盘拿出来,老老实实地按下去吧。~~~~
    本文章转自外挂饭馆http://www.wgum.net
               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    # 欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block var foo = 'bar'; 

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目Value
    电脑$1600
    手机$12
    导管$1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列第二列第三列
    第一列文本居中第二列文本居右第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPEASCIIHTML
    Single backticks'Isn't this fun?'‘Isn’t this fun?’
    Quotes"Isn't this fun?"“Isn’t this fun?”
    Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to- HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

    Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    gantt
            dateFormat  YYYY-MM-DD
            title Adding GANTT diagram functionality to mermaid
            section 现有任务
            已完成               :done,    des1, 2014-01-06,2014-01-08
            进行中               :active,  des2, 2014-01-09, 3d
            计划一               :         des3, after des2, 5d
            计划二               :         des4, after des3, 5d
    
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 1、8个独立按键 人机接口输入部分重要...五向摇杆按键,可以方便实现上下左右方向控制。 1) 原理图 2) 实物图 3) 接口说明 接口编号为JP39,分别为F1、F2、F3、F4、F5。 分别摇杆的的上、左、下、右、中。
  • 长城哈弗赤兔_26_方向盘按钮_汽车驾驶教学操作视频车辆使用指南手册功能演示介绍详解说明书.mp4
  • js实现键盘按键映射

    2019-07-12 15:26:17
    JS监听快捷键组合:ctrlKey、altKey、shiftKey event.key 对应键盘上的符号,比如F键的f,event.key == 'f' event.keyCode对应数值,比如enter键的值是13 Ctrl + enter if(key.ctrlKey &...alt + 方向键...

    JS监听快捷键组合:ctrlKey、altKey、shiftKey

    event.key 对应键盘上的符号,比如F键的f,event.key == 'f'

    event.keyCode 对应数值,比如enter键的值是13

    Ctrl + enter

    if(key.ctrlKey && key.keyCode == 13){
        sbumit();
    }

    alt + 方向键(左)

    if(key.altKey && key.keyCode == 37){
        submit();
    }

    Ctrl + F 

    document.onkeydown = function(key){
        console.log("keyCode: "+key.keyCode);
        if(key.ctrlKey && key.key == 'f'){
            popWindow();
        }
    }

     

    键盘keyCode(键值)表

    1、 字母和数字键的键值表(keyCode)    
    按键键码按键键码按键键码按键键码
    A65J74S83149
    B66K75T84250
    C67L76U85351
    D68M77V86452
    E69N78W87553
    F70O79X88654
    G71P80Y89755
    H72Q81Z89856
    I73R82048957
    2、控制键的键值表     
    按键键码按键键码按键键码按键键码
    BackSpace8Esc27Right Arrow39#NAME?189
    Tab9Spacebar32Down Arrow40.>190
    Clear12Page Up33Insert45/?191
    Enter13Page Down34Delete46`~192
    Shift16End35Num Lock144[{219
    Control17Home36;:186/|220
    Alt18Left Arrow37=+187]}221
    Cape Lock20Up Arrow38,<188'"222
    3、功能键的键值表  
    按键键码按键键码
    F1112F7118
    F2113F8119
    F3114F9120
    F4115F10121
    F5116F11122
    F6117F12123
    4、小键盘上的键值表 
    按键键码按键键码
    0968104
    1979105
    298*106
    399+107
    4100Enter108
    5101-109
    6102.110
    7103/111
    5、多媒体键的键值表
      
    按键键码
    音量加175
    音量减174
    停止179
    静音193
    浏览器172
    邮件180
    搜索170
    收藏171

     

    展开全文
  • 有很朋友买了笔记本后知道笔记本键盘上的每个按钮有什么功能。今天,小编就通过详细的图文说明,给大家详细介绍一下笔记本电脑的所有关键功能。以下所有内容均以以下笔记本键盘为例。不同的笔记本电脑键盘在各个...

    有很多朋友买了笔记本后不知道笔记本键盘上的每个按钮有什么功能。今天,小编就通过详细的图文说明,给大家详细介绍一下笔记本电脑的所有关键功能。

    以下所有内容均以以下笔记本键盘为例。不同的笔记本电脑键盘在各个按键位置上可能会有所不同。请注意。

    1.笔记本电脑键盘按键功能介绍第一栏,顺序从左到右

    0e13508509b7a6a5b97ccfe899f0907f.png

    esc按钮:esc是取消按钮,主要功能是退出当前运行的函数或程序

    功能键(F1-F12):功能键本身没有作用,但是在不用的软件中可以有特定的功能。同时用fn键有自己的功能。例如F1 +FN 可以关闭声音。F2 +FN 可以减少声音等等。

    PrtSc 按钮:截图按钮和打印按钮。按此键并粘贴,即可看到电脑屏幕上的所有内容。或者在连接打印机时,按此按钮直接打印当前页面。

    删除按钮:可以删除或清除当前光标页面上的选中内容

    重启键:长按可以直接强行关闭电脑。当计算机关闭时,您可以通过单击将其打开。

    2.笔记本电脑键盘按键功能介绍第二栏,顺序从左到右

    6794411fbc16caaae416223783dc2087.png

    0e5f2f238b914a6a8c6286ec3ef9b222.png

    最左边的按钮:你可以输入一个特定的符号

    数字键 1-9:您可以输入数字 1-9 和相应的标点符号

    数字键右侧的按钮:输入特定符号

    backsapce button:退格按钮,可以删除光标左边的符号

    3.笔记本电脑键盘按键功能介绍第三栏,顺序从左到右

    88909e66515a6fb5b4ec7b1b0feed662.png

    tab键:表格功能,可以直接在excel中快速移动相同距离

    Q-]键:字母键和特殊符号键

    dccc2088bc1971f3131c3d38f0c34b92.png

    4.笔记本电脑键盘按键功能介绍第四栏,顺序从左到右

    b3dd448c7e9dd9d309992f4f4e1817c8.png

    CapsLk键:大键小键切换键,一键切换状态

    A-'按钮:字母键和特殊符号键

    回车键:回车键,代表OK或换行功能

    5.笔记本电脑按键功能介绍第五栏,顺序从左到右

    282e2dd90921c95d1f3b5a7218b7cba3.png

    Shift键:可以在中英文转换状态之间切换,也可以和其他键一起使用

    z-?按钮:字母键和特殊符号键

    f963cdf1b7430f014111e8f2b49d5994.png

    6.笔记本电脑按键功能介绍第五栏,顺序从左到右

    fb81914a4d3eb5de7d877b95ca0891f3.png

    ctrl 按钮:控制按钮,用于与其他按钮一起使用

    Fn 键:用 f1-f12 发挥不同的功能

    Windows按钮:配合不同字母按钮实现各种快捷功能,如windows+x可以快速打开系统菜单功能等

    Alt 键:可选按钮,可与其他功能键配合使用

    空格键:您可以将文本向右移动

    方向键:可以代替各个界面的鼠标完成上下左右平移选择

    总结

    以上是笔记本电脑键盘上所有按键的功能说明。希望对大家有所帮助。

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/bofangqi/article-382187-1.html

    展开全文
  • 时候我们会给页面设置一些快捷键,但如何在网页上设置快捷键可能对很新手来说十分困难,但是有了这款jQuery键盘按键提示插件,我们可以获取用户任意按键信息,尤其是组合快捷键,功能非常全面。
  • Javascript 检测键盘按键

    千次阅读 2014-02-14 16:47:36
    分别对应的意思是:按键被按下(按下按键但还没有抬起)、点击按键(按下并抬起按键)、按键抬起(按键抬起之后) 按键的分类: 按键可以分为“实键”和“虚键” 实键可以理解为我们能够看到并打印出来...
  • 电脑键盘按键代码表

    千次阅读 2019-08-21 09:49:20
    一:字母和数字按键的建码值 二:数字键盘上的按键的建码值 三:功能按键建码值
  • C#键盘按键的操作

    千次阅读 2020-03-20 20:06:14
    对于键盘按键的操作C#提供了三种方法:KeyDown,KeyPress 和KeyUp 。三个函数分别对应的意义为: KeyDown:在控件有焦点的情况下按下键时发生。 KeyPress:在控件有焦点的情况下按下键时发生。(下面会说和KeyDown ...
  • PC键盘和苹果键盘的按键功能对照

    千次阅读 2012-04-19 18:33:21
    iMac和Macbook上安装windows后,是不是有很PC上习惯的按键都找到了,下面提供一个对照参考~~ PC 按键命令 Apple 外置键盘 内建 Mac 键盘/ Apple Wireless Keyboard 键盘 Control-Alt-Delete ...
  • 据悉,为了让司机因为操作Dash大触摸中控显示屏而在开车过程中分心,特斯拉发布了对Model 3的进行了软件更新,改变了汽车方向盘上的滚动按钮功能。现在,通过按钮,司机可以调整交通感知的巡航控制设置。 如...
  • 最近尝试控制台小程序,以及快捷键组合的时候需要用到侦听键盘事件的操作,然后查阅了...如何按一个键就自动执行很键 如何自动按键 如何python实现按方向键可上下移动 python实现按一个键执行一个函数的功能
  • android对物理按键方向键的支持

    千次阅读 2016-03-14 14:17:47
    现在的android手机是触屏的,对实体按键的支持仅限home,menu,volumeup,volumedown,power等常用的几个,如果想支持类似功能机的全键盘,方向键等,可以修改以下文件, 1,修改 :frameworks/base/core/res/res/...
  • 我们在使用标准108键键盘的时候,经常只使用左边的英文字符区域和右边的小键盘区域,而方向键上方的3个按键大家可能从来没碰过,这些按键你知道它有哪些用处吗?1、prt sc/sys rq键这个键在Windows系统下,基本被...
  • Unity开发 罗技方向盘 G29 白话版

    千次阅读 多人点赞 2019-04-20 00:42:53
    Unity开发罗技方向盘 大白话版欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中...
  • 游戏方向盘原理

    千次阅读 2012-10-24 13:59:27
     要简要说明方向盘原理,首先需要说明一下一个概念:控制器的“轴”(AXIS):玩家在一定的范围内圆滑操作控制器达到类比控制需要,而控制器将玩家的移动量的位置信息量化以后独立输出一组控
  • 键盘F1-F12键采用媒体功能键设计,如图:而在此之前,Lenovo(Ideapad)笔记本电脑键盘F1-F12键采用传统功能键设计,如图:为适应部分用户的传统使用习惯,采用媒体功能键设计的笔记本电脑,BIOS中一般预留了...
  • VC+API模拟键盘按键(详解篇)

    千次阅读 2013-09-20 02:07:17
    模拟按键的方法很,如PostMessage(不能用SendMessage),SendInput,keybd_event。 但最要命的是以上方法基本上都要窗口获取焦点时才有效。也就是想后台模拟键盘按键难度 是很高的。 当然有些特殊
  • 罗技方向盘SDK开发笔记

    千次阅读 2020-03-16 15:46:37
    这段时间因为项目需求,接触到了罗技G29方向盘的SDK开发,能够参考的资料比较有限,一路磕磕碰碰遇见不少问题,硬着头走了下去,不过最后还是成功了,写下这篇笔记来记录下我的开发过程,也给有需要的人参考,少走点...
  • 为了实现利用体感进行方向盘模拟,我们首先要明白,方向盘是一个线性的虚拟手柄,因为玩家在进行不同的旋转操作的时候,会有不同的角度,在这种情况下,我们需要反映成游戏中不同的拐弯角度。而不是像按键手柄,一个...
  • 分别对应的意思是:按键被按下(按下按键但还没有抬起)、点击按键(按下并抬起按键)、按键抬起(按键抬起之后)  按键的分类  按键可以分为“实键”和“虚键”  实键可以理解为我们能够看到并打印出来的按键...
  • 如何获取自己键盘上按键的键值(KeyCode)

    多人点赞 热门讨论 2021-08-20 15:01:05
    文章目录通过C语言获取键值键码值汇总字母和数字的键码值 通过C语言获取键值 #include <stdio.h> #include <conio.h> int main() { int ch; while (1){ if (_kbhit() != 0) //如果键盘被敲击 ...按键
  • 键盘所有按键对应的ASCII码值(键码值)

    万次阅读 多人点赞 2018-05-31 12:13:21
    网页web开发和PC客户端开发涉及到快捷键操作时都会用到键盘上各个按键的ASCII码值,这是编写代码必须要的。按键那么,没有必要全部都记在脑子里,但是常用的几个按键还是有必要记录一下的,这样根据规律可以推算...
  • js控制键盘按键(回车、空格)

    万次阅读 2015-03-27 13:35:46
     ... case 37:keyName = "[方向键左]";... case 38:keyName = "[方向键上]";... case 39:keyName = "[方向键右]";... case 40:keyName = "[方向键下...有时候我就在想是不是在输入好我该输入的东西后,直接敲回车...
  • 向任意应用程序(包括后台的)发送任意按键消息(包括普通字符...刚开始查了很资料和网上网友的解决方案,有些起到一定作用,但也有许多方案经试验证实可行。尤其是关于发送 Shift/Control/Alt 加任意按键的组合

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,499
精华内容 9,399
关键字:

多功能方向盘按键不能用