程序模拟键盘事件,向系统发消息

1)   显示桌面: 

                  很多软件有显示桌面的功能,   并且大家的方法都是遍历窗口,     然后让它们最小化,   其实   win系统给咱们了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键),   利用它,   可以轻松的完成显示桌面的功能. 

        keybd_event(VK_LWIN,   0,   0   ,0); 
        keybd_event( 'M ',   0,   0   ,0); 
        keybd_event( 'M ',   0,   KEYEVENTF_KEYUP   ,0); 
        keybd_event(VK_LWIN,   0,   KEYEVENTF_KEYUP,0); 

其他的操作也类似,   比如直接显示开始的运行,就把上面的 'M '换成 'R '即可。 

直接         keybd_event(VK_LWIN,   0,   0   ,0); 
                        keybd_event(VK_LWIN,   0,   KEYEVENTF_KEYUP,0); 

直接显示“开始”对话框了。 

2)   实现快速的全选 

                很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多罗索的事情呀。用快捷键试一试CTRL+A,其他的快捷键一样的用法,呵呵,你知道怎么办了吧? 

        keybd_event(VK_CONTROL,   (BYTE)0,   0   ,0); 
        keybd_event( 'A ',(BYTE)0,   0   ,0);   //此处可以用     'A ',   (BYTE)65,   用 'a '不起作用. 
        keybd_event( 'A ',   (BYTE)0,   KEYEVENTF_KEYUP,0); 
        keybd_event(VK_CONTROL,   (BYTE)0,   KEYEVENTF_KEYUP,0); 

3)   执行某些特殊的键,比如数字键,大小写,下面是数字键的例子 

        bool   bState=true;       //true为按下NumLock,false反之 
        BYTE   keyState[256]; 
        
        GetKeyboardState((LPBYTE)&keyState); 
        if(   (bState   &&   !(keyState[VK_NUMLOCK]   &   1))   || 
                (!bState   &&   (keyState[VK_NUMLOCK]   &   1))   ) 
        { 
                //   Simulate   a   key   press 
                keybd_event(   VK_NUMLOCK, 
                        0x45, 
                        KEYEVENTF_EXTENDEDKEY   |   0, 
                        0   ); 
                
                //   Simulate   a   key   release 
                keybd_event(   VK_NUMLOCK, 
                        0x45, 
                        KEYEVENTF_EXTENDEDKEY   |   KEYEVENTF_KEYUP, 
                        0); 
        } 

4)   你想CTRL+ALT+DELETE三键一起按下, 

        keybd_event(VK_CONTROL,   0,   0   ,0); 
        keybd_event(VK_MENU,0,   0   ,0); 
        keybd_event(VK_DELETE,0,   0   ,0); 

        keybd_event(VK_CONTROL,   0,   KEYEVENTF_KEYUP   ,0); 
        keybd_event(VK_MENU,0,   KEYEVENTF_KEYUP   ,0); 
        keybd_event(VK_DELETE,0,   KEYEVENTF_KEYUP   ,0); 
呵呵,这样不会成功呀,因为这几个键直接是操作系统来截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用         LockWorkStation();) 

5)   Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代码都可以用这个来完成 

      //2000下用这个代替   ,包含   "winable.h " 
        INPUT   input[4]; 
        memset(input,   0,   sizeof(input)); 

        input[0].type   =   input[1].type   =   input[2].type   =   input[3].type   =   INPUT_KEYBOARD; 

        input[0].ki.wVk     =   input[3].ki.wVk   =   VK_LWIN; 
        input[1].ki.wVk     =   input[2].ki.wVk   =   'R '; 

        
        //接下来释放它,这一点很重要。 
        input[2].ki.dwFlags   =   input[3].ki.dwFlags   =   KEYEVENTF_KEYUP; 
        input[0].ki.time   =   input[1].ki.time   =   input[2].ki.time   =   input[3].ki.time   =   GetTickCount(); 

        SendInput(4,   input,   sizeof(INPUT)); 

感觉比那个有点罗索,呵呵。 

==================== 

附WIN键的部分快捷键: 

WIN键+D=快速的切到桌面,再次点击返回 

WIN键+E=快速打开资源管理器 

WIN键+R=“运行”。 

WIN键+M=全部视窗最小化。 

WIN键+Shift+M=取消全部视窗最小化。 

WIN键+F1=Help。 

WIN键+F=“寻找”。 

WIN键+Ctrl+F=显示“查找电脑”。 

WIN键+Tab=切换工作列的程式。   

WIN键+Break=显示系统内容。 

 

 

模拟ctrl+alt+delete三键解锁server端     

-------------------------------------------------------------------------------- 
www.hackbase.com   阅读:   时间:2005-1-13   5:05:23   来源:www.hackbase.com     
来源:www.zahui.com 

在我们编写远程控制软件的时候,我们会发现要想解锁server端我们就得发送这三个键的虚拟。 

下面我说一下解决过程 


1.一开始,决定通过keybd_event()来模拟键盘 

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);   
          keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0,0);   
          keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),0,0); 
                keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),KEYEVENTF_KEYUP,0); 
          keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);   
          keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);   
发现只能模拟ctrl+alt两个键的效果,然而其他的两个键的都可以模拟比如win+d。不知道是不是keybd_event()只能模拟两键还是因为 
ctrl+alt+delete的特殊性,望高手告之,在此谢过。 

2.运用PostMessage(HWND_BROADCAST,   WM_HOTKEY,   0,   MAKELONG(MOD_ALT   |   MOD_CONTROL,   VK_DELETE));来发送虚拟键盘,但是在winNT以后的系统里我们还有很多事情要做,比如:OpenDesktop()、OpenInputDesktop()、GetThreadDesktop()、SetThreadDesktop()、CloseDesktop()、GetUserObjectInformation() 

代码如下: 


#include   "windows.h " 
BOOL   simulateAltControlDel(); 
void   main() 

        simulateAltControlDel(); 

BOOL   simulateAltControlDel() 

        HDESK       hdeskCurrent; 
        HDESK       hdesk; 
        HWINSTA   hwinstaCurrent; 
        HWINSTA   hwinsta; 
        //   
        //   Save   the   current   Window   station 
        //   
        hwinstaCurrent   =   GetProcessWindowStation(); 
        if   (hwinstaCurrent   ==   NULL) 
                return   FALSE; 
        //   
        //   Save   the   current   desktop 
        //   
        hdeskCurrent   =   GetThreadDesktop(GetCurrentThreadId()); 
        if   (hdeskCurrent   ==   NULL) 
                return   FALSE; 
        //   
        //   Obtain   a   handle   to   WinSta0   -   service   must   be   running 
        //   in   the   LocalSystem   account 
        //   
        hwinsta   =   OpenWindowStation( "winsta0 ",   FALSE, 
                                                            WINSTA_ACCESSCLIPBOARD       | 
                                                            WINSTA_ACCESSGLOBALATOMS   | 
                                                            WINSTA_CREATEDESKTOP           | 
                                                            WINSTA_ENUMDESKTOPS             | 
                                                            WINSTA_ENUMERATE                   | 
                                                            WINSTA_EXITWINDOWS               | 
                                                            WINSTA_READATTRIBUTES         | 
                                                            WINSTA_READSCREEN                 | 
                                                            WINSTA_WRITEATTRIBUTES); 
        if   (hwinsta   ==   NULL) 
                return   FALSE; 
        //   
        //   Set   the   windowstation   to   be   winsta0 
        //   
        if   (!SetProcessWindowStation(hwinsta)) 
          return   FALSE; 

        //   
        //   Get   the   default   desktop   on   winsta0 
        //   
        hdesk   =   OpenDesktop( "Winlogon ",   0,   FALSE, 
                                                DESKTOP_CREATEMENU   | 
                            DESKTOP_CREATEWINDOW   | 
                                                DESKTOP_ENUMERATE         | 
                                                DESKTOP_HOOKCONTROL     | 
                                                DESKTOP_JOURNALPLAYBACK   | 
                                                DESKTOP_JOURNALRECORD   | 
                                                DESKTOP_READOBJECTS   | 
                                                DESKTOP_SWITCHDESKTOP   | 
                                                DESKTOP_WRITEOBJECTS); 
        if   (hdesk   ==   NULL) 
              return   FALSE; 

        //   
        //   Set   the   desktop   to   be   "default " 
        //   
        if   (!SetThreadDesktop(hdesk)) 
              return   FALSE; 
        PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE)); 


        //   
        //   Reset   the   Window   station   and   desktop 
        //   
        if   (!SetProcessWindowStation(hwinstaCurrent)) 
              return   FALSE; 

        if   (!SetThreadDesktop(hdeskCurrent)) 
        return   FALSE; 

        //   
        //   Close   the   windowstation   and   desktop   handles 
        //   
        if   (!CloseWindowStation(hwinsta)) 
                return   FALSE; 
        if   (!CloseDesktop(hdesk)) 
                return   FALSE; 
        return   TRUE; 


偶一开始试验了发现不成功,后来冰河大哥告诉我说OpenDesktop( "Winlogon ",   ......)本身需要LocalSystem权限, 
果然如此,把它注册成服务,然后效果实现。相信如何注册成服务不用我说了吧。ok,我们想要的功能实现了。 

3.还有一种方法 
Dos下键盘的完全控制   -------   一系列的BIOS级别的键盘控制函数! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值