玩转keybd

    技术2025-08-27  21

     

    玩转keybd_event

    http://blog.vckbase.com/lishengg_blog/archive/2004/10/28/1141.aspx

     

     

           模拟键盘平时不是很常用, 但是当调用某些快捷键执行某项功能时, 它真的是那么的方便呀.  你不信?  看看下面的实现, 你就会大呼: 为什么不早点告诉我?  呵呵,  原来没有blog呀,  都靠这些挣分呢.

    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=显示系统内容。

    posted on 2004-10-28 22:56 lishengg的紫罗兰茶馆 阅读(17280) 评论(24)  编辑 收藏

     

    最新回复(0)