最近码代码码的有点多,作为一个专业的CV工作者。小拇指按ctrl键按的关节疼。恰逢最近在学习C/C++,所以想着能不能使用C/C++修改一下ctrl+c和ctrl+v 以便更方便的完成CV工作,所以就出现了下面的代码
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
HHOOK keyboardHook = 0; // 钩子句柄
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode, // 规定钩子如何处理消息,小于 0 则直接 CallNextHookEx
_In_ WPARAM wParam, // 消息类型
_In_ LPARAM lParam // 指向某个结构体的指针,这里是 KBDLLHOOKSTRUCT(低级键盘输入事件)
){
KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam; // 包含低级键盘输入事件信息
if(ks->flags == 128 || ks->flags == 129)
{
// F1 代替 ctrl+c F2 代替ctrl+v
if(ks->vkCode==112){
//按下了F1
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VkKeyScan('C'),0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(VkKeyScan('C'),0,KEYEVENTF_KEYUP,0);
return 1;
}else if(ks->vkCode==113){
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VkKeyScan('V'),0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(VkKeyScan('V'),0,KEYEVENTF_KEYUP,0);
return 1;
}
//return 1; // 使按键失效
}
if(ks->vkCode==112||ks->vkCode==113){
return 1;
}
// 将消息传递给钩子链中的下一个钩子
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
keyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL, // 钩子类型,WH_KEYBOARD_LL 为键盘钩子
LowLevelKeyboardProc, // 指向钩子函数的指针
GetModuleHandleA(NULL), // Dll 句柄
NULL
);
if (keyboardHook == 0){cout << "挂钩键盘失败" << endl; return -1;}
//不可漏掉消息处理,不然程序会卡死
MSG msg;
while(1)
{
// 如果消息队列中有消息
if (PeekMessageA(
&msg, // MSG 接收这个消息
NULL, // 检测消息的窗口句柄,NULL:检索当前线程所有窗口消息
NULL, // 检查消息范围中第一个消息的值,NULL:检查所有消息(必须和下面的同时为NULL)
NULL, // 检查消息范围中最后一个消息的值,NULL:检查所有消息(必须和上面的同时为NULL)
PM_REMOVE // 处理消息的方式,PM_REMOVE:处理后将消息从队列中删除
)){
// 把按键消息传递给字符消息
TranslateMessage(&msg);
// 将消息分派给窗口程序
DispatchMessageW(&msg);
}
else
Sleep(0); //避免CPU全负载运行
}
// 删除钩子
UnhookWindowsHookEx(keyboardHook);
return 0;
}
代码中将复制改为F1 粘贴改为F2 。又可以愉快的进行CV工作了。赞一个。
参考文献:https://blog.csdn.net/GDUT_xin/article/details/125418475