请教键盘钩子

ActiveXForm 2003-12-03 02:06:44
如何用 别的键或者键组合 来代替 Ctrl + C 和 Ctrl + V (也就是替换掉系统的复制粘贴键) , 谢谢
...全文
68 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GodBirdFlying 2004-03-25
  • 打赏
  • 举报
回复
学习顺便up
hohulove 2003-12-05
  • 打赏
  • 举报
回复
这样册系统全局热键就可以搞定以下是示例:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RegisterHotKey(Handle,GlobalAddAtom("F1")+0xC001,MOD_ALT,112);
RegisterHotKey(Handle,GlobalAddAtom("F2")+0xC002,MOD_ALT,113);

}

void __fastcall TForm1::AutoOpen(TMessage myopen)
{
//TODO: Add your source code here
if(myopen.LParamHi==112)
{
WinExec("E:\\Program Files\\Microsoft Visual Studio\\VB98\\VB6.EXE",SW_RESTORE);
}
}
ActiveXForm 2003-12-05
  • 打赏
  • 举报
回复
那要注册系统热键该怎么作 ? 我只作过窗体的热键
wjlsmail 2003-12-04
  • 打赏
  • 举报
回复
// 收邮件
wjlsmail 2003-12-04
  • 打赏
  • 举报
回复
都差不多, 有个问题,借小何宝地:)

要是人家屏蔽了 ClipBoard 有要怎么办呢 ?
yjy1001 2003-12-04
  • 打赏
  • 举报
回复
如果只是想替换 Ctrl + c 和Ctrl + v
向系统注册 热键就可以满足楼主的要求了

写钩子,太占系统资源了,不到非写不可的情况,不要写。
而且 注册了钩子后 ,不用的时候 应该 立即销毁钩子。

1楼的钩子应该是可以的。

如果 楼主使用的win2000以上的操作系统,可以向系统注册低阶键盘钩子,而不需要写DLL这么麻烦。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK OldHook;// 钩子 句柄

//键盘钩子 封锁 windows 热键
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs;

if (code < 0)
return CallNextHookEx(OldHook,
code, wParam, lParam);

pkbhs = (KBDLLHOOKSTRUCT*) lParam;

if(pkbhs->vkCode == 67 && GetAsyncKeyState(VK_CONTROL) < 0)
{
//ctrl +c 这里屏蔽掉ctrl+c
return 1;//return 1 屏蔽。 ctrl + v 一样的。
}

return CallNextHookEx(OldHook,
code, wParam, lParam);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//注册 钩子
OldHook = SetWindowsHookEx(
WH_KEYBOARD_LL, (HOOKPROC
)KeyProc, HInstance, 0);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// 销毁 钩子
UnhookWindowsHookEx(OldHook);
}
//---------------------------------------------------------------------------

需要win 2000以上的操作系统 才可以 注册WH_KEYBOARD_LL 低阶键盘钩子
否则需要写成DLL实现
叶子哟 2003-12-03
  • 打赏
  • 举报
回复
钩子就行
heng2003 2003-12-03
  • 打赏
  • 举报
回复
我试了用键盘钩子可以来代替
估计还有其他的方法,或是用系统热键,这个我没试过
代码如下:

// replacekey.dll
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused
HHOOK OldHook=NULL;
HINSTANCE hInst=NULL;
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason==DLL_PROCESS_ATTACH){
hInst = hinst;
OldHook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)KeyProc, hInst, NULL);
}
else if(reason==DLL_PROCESS_DETACH)
if (OldHook)
UnhookWindowsHookEx(OldHook);
return 1;
}

long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
static bool lock = false;
KBDLLHOOKSTRUCT *key = (KBDLLHOOKSTRUCT*)lParam;
if(lock == false && key->vkCode == 67 && GetAsyncKeyState(VK_CONTROL)<0){
//ctrl +c //这里屏蔽掉ctrl+c 当lock = false 才屏蔽

return 1;
}

if(key->vkCode == 66 && GetAsyncKeyState(VK_CONTROL)<0){
//ctrl + b 模拟代替ctrl+c
lock = true; //关掉ctrl+c 的屏蔽标记
//模拟键盘事件
keybd_event(VK_CONTROL,0,0,0);
keybd_event(67,0,0,0);
keybd_event(67,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
lock = false; //打开ctrl+c 的屏蔽标记
return 1;
}

return CallNextHookEx(OldHook,code,wParam,lParam);
}

//ctrl+ v 同理

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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