【转】玩转key_event

本文介绍了如何使用模拟键盘事件实现常见的快捷键操作,如显示桌面、全选等,并提供了具体的代码示例。此外还探讨了如何模拟特殊按键及组合键,并给出了一种更推荐的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【转】玩转key_event
2009-10-24 15:28
模拟键盘平时不是很常用, 但是当调用某些快捷键执行某项功能时, 它真的是那么的方便呀.   你不信?   看看下面的实现, 你就会大呼: 为什么不早点告诉我?  

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

### 更好地使用 React 技巧和最佳实践 #### 安装与配置 ESLint 提高代码质量 为了确保 React 项目的高质量编码标准,在项目中引入 ESLint 是一种有效的方法。ESLint 不仅可以自动检测并修复一些常见的错误,还可以强制执行一致的编码风格[^1]。 ```javascript // .eslintrc.js 配置文件示例 module.exports = { extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', // 如果使用 TypeScript 'prettier' ], }; ``` #### 性能优化策略 对于性能敏感的应用程序来说,合理设置组件 key 属性至关重要。这有助于 React 准确识别哪些元素发生了变化,从而最小化不必要的重新渲染操作。另外,采用懒加载(Lazy Loading)技术按需加载模块也可以显著改善初次加载时间[^2]。 ```jsx import React, { Suspense } from 'react'; const HeavyComponent = React.lazy(() => import('./HeavyComponent')); function App() { return ( <Suspense fallback={<div>Loading...</div>}> <HeavyComponent /> </Suspense> ); } ``` #### 利用 Hooks 增强功能性和可维护性 `useCallback` 和 `useMemo` 可用于创建依赖项不变的记忆版本回调函数或计算结果,防止因父级重绘而导致子组件无意义刷新;而自定义 hooks 则允许封装逻辑片段供多个地方重复利用,极大提高了代码复用率和清晰度[^3]。 ```jsx import { useCallback, useMemo } from 'react'; export default function MyComponent({ items }) { const memoizedItems = useMemo(() => computeExpensiveValue(items), [items]); const handleClick = useCallback((event) => { console.log('Clicked!', event); }, []); // ... } ``` #### 学习资源推荐 针对不同层次的学习者,《React 18 设计模式与最佳实践第四版》提供了全面深入的内容覆盖,无论是初学者入门还是资深工程师寻求进阶指导都非常合适[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值