求教MFC中用keybd_event方法模拟按键

kllll1119 2013-12-03 04:19:29
MFC用keybd_event模拟按win+D键(最小化所有窗口),为什么不起作用啊

keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('D', 0, 0 ,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
...全文
431 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大道曙光 2013-12-08
  • 打赏
  • 举报
回复

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>

void EmulateLWinDV1(void)
{
    UINT uVSCOfLWin = MapVirtualKey(VK_LWIN, MAPVK_VK_TO_VSC_EX);
    UINT uVSCOfD    = MapVirtualKey('D', MAPVK_VK_TO_VSC_EX);

    // LWin down
    keybd_event(VK_LWIN, uVSCOfLWin, 
        KEYEVENTF_EXTENDEDKEY | 0, 0);
    // 'D' down
    keybd_event('D', uVSCOfD, 
        KEYEVENTF_EXTENDEDKEY | 0, 0);
    // 'D' up
    keybd_event('D', uVSCOfD, 
        KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    // LWin up
    keybd_event(VK_LWIN, uVSCOfLWin, 
        KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}

void EmulateLWinDV2(void)
{
    INPUT keyPress;

    keyPress.type = INPUT_KEYBOARD;
    keyPress.ki.time = 0;
    keyPress.ki.dwExtraInfo = GetMessageExtraInfo();

    /// down
    keyPress.ki.dwFlags = 0;
    // LWin down
    keyPress.ki.wVk = VK_LWIN;
    SendInput(1, &keyPress, sizeof(keyPress));
    // 'D' down
    keyPress.ki.wVk = 'D';
    SendInput(1, &keyPress, sizeof(keyPress));
    
    /// up
    keyPress.ki.dwFlags = KEYEVENTF_KEYUP;
    // 'D' up
    SendInput(1, &keyPress, sizeof(keyPress));
    // LWin up
    keyPress.ki.wVk = VK_LWIN;
    SendInput(1, &keyPress, sizeof(keyPress));
}

int _tmain(int argc, _TCHAR **argv)
{
#if 0
    EmulateLWinDV1();
#else
    EmulateLWinDV2();
#endif
    return 0;
}
而且SendInput可以让你把一系列按键操作放到一个数组中,然后调用一次SendInput发送出去。
赵4老师 2013-12-03
  • 打赏
  • 举报
回复
DOWN和UP不配对? http://www.autohotkey.com
大道曙光 2013-12-03
  • 打赏
  • 举报
回复
MSDN: Windows NT/2000/XP/Vista:This function has been superseded. Use SendInput instead. 也就是说,不推荐使用这个旧函数。考虑使用SendInput代替。 至于SendInput的用法,查一下MSDN就行了。
图灵狗 2013-12-03
  • 打赏
  • 举报
回复
参考http://www.vckbase.com/index.php/wv/160.html,里面有源代码。
引用 楼主 kllll1119 的回复:
MFC用keybd_event模拟按win+D键(最小化所有窗口),为什么不起作用啊 keybd_event(VK_LWIN, 0, 0 ,0); keybd_event('D', 0, 0 ,0); keybd_event('D', 0, KEYEVENTF_KEYUP ,0); keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧