如何使用钩子(hook)实现键盘组合键拦截?

Keng 2003-07-09 11:11:26
我在使用TCppWebBrowser写一个程序的框架时。。发现Ctrl+n也可以对TCppWebBrowser造成创建新窗口的问题。。请问如何屏蔽Ctrl+n ,,Ctrl+b等组合键
我是用的是hook(hook代码在dll中实现)
下边是代码:
#include <windows.h>

extern "C" __declspec(dllexport) void __stdcall SetHook(HWND,bool);

#pragma argsused


LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);

static HINSTANCE hinstances;
static HANDLE handles;
static HHOOK hook;
static const mmsg=200;
static const sec=1;


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
hinstances=hinst;
return 1;
}
//---------------------------------------------------------------------------
void __stdcall SetHook(HANDLE hwnd,bool nCode)
{
if(nCode)
{
handles=hwnd;
hook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,hinstances,0);
}
else
{UnhookWindowsHookEx(hook);}

}
//---------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
char abc[255];
HANDLE hand;
HDC hdc;

EVENTMSG *keyMsg=(EVENTMSG*)lParam;

hand=GetDesktopWindow();
hdc=GetWindowDC(hand);

if(keyMsg->message==WM_KEYDOWN)
{
PostMessage(handles,mmsg,(char)keyMsg->paramL,sec);


itoa(keyMsg->paramL,abc,10);
TextOut(hdc,400,400,abc,10);
}
DeleteObject(hdc);
return(int)CallNextHookEx(hook,nCode,wParam,lParam);

}
请高手指点。。
...全文
1710 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzlong 2003-08-29
  • 打赏
  • 举报
回复
study
「已注销」 2003-08-06
  • 打赏
  • 举报
回复
gz
Keng 2003-07-24
  • 打赏
  • 举报
回复
还有没有其他方法呀?
:)
asimpleman 2003-07-20
  • 打赏
  • 举报
回复
gz
FlySky01 2003-07-16
  • 打赏
  • 举报
回复
学习.............
farfh 2003-07-16
  • 打赏
  • 举报
回复
CRegKey key;
key.Open(HKEY_CURRENT_USER,"software\\microsoft\\windows\\currentversion\\policies\\system");
key.Write("DisableTaskMgr",1);
key.Close();
farfh 2003-07-16
  • 打赏
  • 举报
回复
不需要重新启动机子啊,我说的方法上面有人讲过了,就是用注册表把那几个按纽禁止了,直接有效的
Keng 2003-07-15
  • 打赏
  • 举报
回复
farfh(慕容长风) 兄。。你说的“注册表”可以实时产生效果还是需要重起机器?
请介绍一下方法。
xuv2002 2003-07-11
  • 打赏
  • 举报
回复
同意
其实锁键盘的程序好早之前就写了的,一直没改
用GetAsynKeyState来判断Ctrl Alt 当前的按下状态是可行的,也方便些

moneytree 2003-07-11
  • 打赏
  • 举报
回复 1
使用键盘hook,针对不同的wParam值如('C')配合GetAsynKeystate(),可以解决.
switch(wParam)
{
case 67: //'c'按下
short ctrlid=GetAsynKeystate(VK_CTRL); //得到Ctrl键状态
if(ctrlid<0)
//ctrl+c 按下
break;
}
wjlsmail 2003-07-11
  • 打赏
  • 举报
回复
Study ...
Keng 2003-07-11
  • 打赏
  • 举报
回复
xuv2002(XuWei) 兄辛苦你了。看了你贴的资料我惊讶了。真是非常感谢。
xuv2002 2003-07-11
  • 打赏
  • 举报
回复
接上贴:
//locknt.h
typedef BOOL
(WINAPI *
pWlxNegotiate)(
DWORD dwWinlogonVersion,
PDWORD pdwDllVersion
);

typedef BOOL
(WINAPI *
pWlxInitialize)(
LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID * pWlxContext
);

typedef VOID
(WINAPI *
pWlxDisplaySASNotice)(
PVOID pWlxContext
);


typedef int
(WINAPI *
pWlxLoggedOutSAS)(
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
PVOID * pProfile
);

typedef BOOL
(WINAPI *
pWlxActivateUserShell)(
PVOID pWlxContext,
PWSTR pszDesktopName,
PWSTR pszMprLogonScript,
PVOID pEnvironment
);

typedef int
(WINAPI *
pWlxLoggedOnSAS)(
PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved
);

typedef VOID
(WINAPI *
pWlxDisplayLockedNotice)(
PVOID pWlxContext
);

typedef int
(WINAPI *
pWlxWkstaLockedSAS)(
PVOID pWlxContext,
DWORD dwSasType
);

typedef BOOL
(WINAPI *
pWlxIsLockOk)(
PVOID pWlxContext
);

typedef BOOL
(WINAPI *
pWlxIsLogoffOk)(
PVOID pWlxContext
);

typedef VOID
(WINAPI *
pWlxLogoff)(
PVOID pWlxContext
);


typedef VOID
(WINAPI *
pWlxShutdown)(
PVOID pWlxContext,
DWORD ShutdownType
);


//
// NEW for version 1.1
//
typedef BOOL
(WINAPI *
pWlxScreenSaverNotify)(
PVOID pWlxContext,
BOOL * pSecure);

typedef BOOL
(WINAPI *
pWlxStartApplication)(
PVOID pWlxContext,
PWSTR pszDesktopName,
PVOID pEnvironment,
PWSTR pszCmdLine
);

//
// New for 1.3
//

typedef BOOL
(WINAPI *
pWlxNetworkProviderLoad)(
PVOID pWlxContext,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo
);


typedef BOOL
(WINAPI *
pWlxDisplayStatusMessage)(
PVOID pWlxContext,
HDESK hDesktop,
DWORD dwOptions,
PWSTR pTitle,
PWSTR pMessage
);

typedef BOOL
(WINAPI *
pWlxGetStatusMessage)(
PVOID pWlxContext,
DWORD * pdwOptions,
PWSTR pMessage,
DWORD dwBufferSize
);

typedef BOOL
(WINAPI *
pWlxRemoveStatusMessage)(
PVOID pWlxContext
);

pWlxNegotiate prcWlxNegotiate = NULL;
pWlxInitialize prcWlxInitialize = NULL;
pWlxDisplaySASNotice prcWlxDisplaySASNotice = NULL;
pWlxLoggedOutSAS prcWlxLoggedOutSAS = NULL;
pWlxActivateUserShell prcWlxActivateUserShell = NULL;
pWlxLoggedOnSAS prcWlxLoggedOnSAS = NULL;
pWlxDisplayLockedNotice prcWlxDisplayLockedNotice = NULL;
pWlxWkstaLockedSAS prcWlxWkstaLockedSAS = NULL;
pWlxIsLockOk prcWlxIsLockOk = NULL;
pWlxIsLogoffOk prcWlxIsLogoffOk = NULL;
pWlxLogoff prcWlxLogoff = NULL;
pWlxShutdown prcWlxShutdown = NULL;
pWlxScreenSaverNotify prcWlxScreenSaverNotify = NULL;
pWlxStartApplication prcWlxStartApplication = NULL;
pWlxNetworkProviderLoad prcWlxNetworkProviderLoad = NULL;
pWlxDisplayStatusMessage prcWlxDisplayStatusMessage = NULL;
pWlxGetStatusMessage prcWlxGetStatusMessage = NULL;
pWlxRemoveStatusMessage prcWlxRemoveStatusMessage = NULL;

HINSTANCE hGina = NULL;

BOOL LoadMsGina(){
hGina = LoadLibrary("msgina.dll");
if (hGina){
prcWlxNegotiate = (pWlxNegotiate)GetProcAddress(hGina, "WlxNegotiate");
prcWlxInitialize = (pWlxInitialize)GetProcAddress(hGina, "WlxInitialize");
prcWlxDisplaySASNotice = (pWlxDisplaySASNotice )GetProcAddress(hGina, "WlxDisplaySASNotice");
prcWlxLoggedOutSAS = (pWlxLoggedOutSAS)GetProcAddress(hGina, "WlxLoggedOutSAS");
prcWlxActivateUserShell = (pWlxActivateUserShell)GetProcAddress(hGina, "WlxActivateUserShell");
prcWlxLoggedOnSAS = (pWlxLoggedOnSAS)GetProcAddress(hGina, "WlxLoggedOnSAS");
prcWlxDisplayLockedNotice = (pWlxDisplayLockedNotice)GetProcAddress(hGina, "WlxDisplayLockedNotice");
prcWlxWkstaLockedSAS = (pWlxWkstaLockedSAS)GetProcAddress(hGina, "WlxWkstaLockedSAS");
prcWlxIsLockOk = (pWlxIsLockOk)GetProcAddress(hGina, "WlxIsLockOk");
prcWlxIsLogoffOk = (pWlxIsLogoffOk)GetProcAddress(hGina, "WlxIsLogoffOk");
prcWlxLogoff = (pWlxLogoff)GetProcAddress(hGina, "WlxLogoff");
prcWlxShutdown = (pWlxShutdown)GetProcAddress(hGina, "WlxShutdown");
prcWlxScreenSaverNotify = (pWlxScreenSaverNotify)GetProcAddress(hGina, "WlxScreenSaverNotify");
prcWlxStartApplication = (pWlxStartApplication)GetProcAddress(hGina, "WlxStartApplication");
prcWlxNetworkProviderLoad = (pWlxNetworkProviderLoad)GetProcAddress(hGina, "WlxNetworkProviderLoad");
prcWlxDisplayStatusMessage = (pWlxDisplayStatusMessage)GetProcAddress(hGina, "WlxDisplayStatusMessage");
prcWlxGetStatusMessage = (pWlxGetStatusMessage)GetProcAddress(hGina, "WlxGetStatusMessage");
prcWlxRemoveStatusMessage = (pWlxRemoveStatusMessage)GetProcAddress(hGina, "WlxRemoveStatusMessage");
return prcWlxNegotiate && prcWlxInitialize && prcWlxDisplaySASNotice && prcWlxLoggedOutSAS
&& prcWlxActivateUserShell && prcWlxLoggedOnSAS && prcWlxDisplayLockedNotice
&& prcWlxWkstaLockedSAS && prcWlxIsLockOk && prcWlxIsLogoffOk && prcWlxLogoff
&& prcWlxShutdown && prcWlxScreenSaverNotify && prcWlxStartApplication
&& prcWlxNetworkProviderLoad && prcWlxDisplayStatusMessage && prcWlxGetStatusMessage
&& prcWlxRemoveStatusMessage;
}
else
return FALSE;
}

void ReleaseMsGina()
{
if (hGina){
FreeLibrary(hGina);
}
}

这个方法是采用自己编写的dll来代替系统原来的dll 来达到屏蔽的目的

上边是用来屏蔽NT内核系统的ctrl+alt+del
其实有一种通过改写注册表的方法来达到禁用任务管理器的方法(相当于屏蔽了ctrl+alt+del了吧)
TRegistry * reg = 0;
try{
reg = new TRegistry();
reg->RootKey = HKEY_CURRENT_USER;
AnsiString KeyName = "Software\\microsoft\\windows\\currentversion\\policies\\system";
if(reg->OpenKey(KeyName,true)){
reg->WriteString("DisableTaskMgr","0");
reg->CloseKey();
}
}catch(...){}
if(reg){ delete reg; reg = NULL; }
要恢复只需删除"disableTaskmgr"键值就可以

假如是win98 则简单的多
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,NULL,0);

xuv2002 2003-07-11
  • 打赏
  • 举报
回复
假如需要锁定ctrl+alt+del 则麻烦许多
这是我从网上摘抄的一篇文章
//locknt.c
#include <windows.h>
#include <Winwlx.h>
#include "LockNt.h"


//在启动后,按CTRL_ALT_DEL,系统回调用WlxLoggedOnSAS!
//将这个DLL拷到system32目录下,并在注册表中加入:
//\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
//加一个GinaDLL,类型RegSZ, 内容为你的dll名,如:'MyGina.dll'.
//重起机器,系统就会使用你的dll,GINA可以实现很多东西,值得研究!
//按下CTRL+ALT+DEL屏幕会闪一下,那是因为屏幕从Winsta0转到Desktop!
//必须要用unicode,如果改了后启动不了,请将msgina.dll拷贝成你的dll,再启动!

//这种方法能达到效果,但是相对危险一些,很容易造成系统启动不了

BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
)
{
switch (fdwReason){
case DLL_PROCESS_ATTACH:
LoadMsGina();
break;
case DLL_PROCESS_DETACH:
ReleaseMsGina();
break;
}
return TRUE;
}

BOOL WINAPI
WlxActivateUserShell (
PVOID pWlxContext,
PWSTR pszDesktopName,
PWSTR pszMprLogonScript,
PVOID pEnvironment)
{
return prcWlxActivateUserShell (
pWlxContext,
pszDesktopName,
pszMprLogonScript,
pEnvironment);
}

VOID WINAPI WlxDisplaySASNotice (
PVOID pWlxContext)
{
prcWlxDisplaySASNotice(pWlxContext);
}

BOOL WINAPI WlxInitialize (
LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID * pWlxContext)
{
return prcWlxInitialize (
lpWinsta,
hWlx,
pvReserved,
pWinlogonFunctions,
pWlxContext);
}

int WINAPI WlxLoggedOnSAS (
PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved)
{
HANDLE hMutex = NULL;
if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL){ //屏蔽CTRL_ALT_DEL,也可以根据特定条件来决定是否要屏蔽
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "MY_PROGRAM");
if (hMutex){
CloseHandle(hMutex);
return WLX_SAS_ACTION_NONE;
}
}

return prcWlxLoggedOnSAS (
pWlxContext,
dwSasType,
pReserved);
}

int WINAPI WlxLoggedOutSAS (
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile)
{
return prcWlxLoggedOutSAS (
pWlxContext,
dwSasType,
pAuthenticationId,
pLogonSid,
pdwOptions,
phToken,
pMprNotifyInfo,
pProfile);
}

VOID WINAPI WlxLogoff (PVOID pWlxContext)
{
prcWlxLogoff(pWlxContext);
}

BOOL WINAPI WlxNegotiate (
DWORD dwWinlogonVersion,
PDWORD pdwDllVersion)
{
return prcWlxNegotiate (
dwWinlogonVersion,
pdwDllVersion);
}


BOOL WINAPI WlxScreenSaverNotify (
PVOID pWlxContext,
BOOL *pSecure)
{
return prcWlxScreenSaverNotify (
pWlxContext,
pSecure);
}

VOID WINAPI WlxShutdown(
PVOID pWlxContext,
DWORD ShutdownType)
{
prcWlxShutdown(pWlxContext, ShutdownType);
}

BOOL WINAPI WlxStartApplication (
PVOID pWlxContext,
PWSTR pszDesktopName,
PVOID pEnvironment,
PWSTR pszCmdLine)
{
return prcWlxStartApplication (
pWlxContext,
pszDesktopName,
pEnvironment,
pszCmdLine);
}

int WINAPI WlxWkstaLockedSAS (
PVOID pWlxContext,
DWORD dwSasType
)
{
return prcWlxWkstaLockedSAS (
pWlxContext,
dwSasType
);
}

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
prcWlxDisplayLockedNotice(pWlxContext);
}

BOOL WINAPI WlxDisplayStatusMessage(
PVOID pWlxContext,
HDESK hDesktop,
DWORD dwOptions,
PWSTR pTitle,
PWSTR pMessage
){
return prcWlxDisplayStatusMessage(
pWlxContext,
hDesktop,
dwOptions,
pTitle,
pMessage
);
}


BOOL WINAPI WlxGetStatusMessage(
PVOID pWlxContext,
DWORD *pdwOptions,
PWSTR pMessage,
DWORD dwBufferSize
)
{
return prcWlxGetStatusMessage(
pWlxContext,
pdwOptions,
pMessage,
dwBufferSize
);
}

BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
return prcWlxIsLockOk(pWlxContext);

}

BOOL WINAPI WlxIsLogoffOk(
PVOID pWlxContext
)
{
return prcWlxIsLogoffOk(
pWlxContext
);
}

BOOL WINAPI WlxNetworkProviderLoad(
PVOID pWlxContext,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo
)
{
return prcWlxNetworkProviderLoad(
pWlxContext,
pNprNotifyInfo
);
}

BOOL WINAPI WlxRemoveStatusMessage(
PVOID pWlxContext
)
{
return prcWlxRemoveStatusMessage(
pWlxContext
);
}

xuv2002 2003-07-11
  • 打赏
  • 举报
回复
锁Alt+Tab 可以使用键盘钩子
程序代码如下
下面得代码锁定了Ctrl Alt 等键值
//---------------------------------------------------------------------------

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

#pragma argsused
extern "C" __declspec (dllexport) bool __stdcall GetKBState(bool disable);
HHOOK OldHook=NULL;
HINSTANCE hInst=NULL;
bool ctrldown = false;
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;
}
else if(reason==DLL_PROCESS_DETACH)
if (OldHook)
UnhookWindowsHookEx(OldHook);
return 1;
}

bool __stdcall GetKBState(bool disable)
{
//这个函数是用来启动钩子,参数disable 为true 启动 否则钩子关闭
if (disable) {
if (OldHook == NULL)
OldHook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)KeyProc, hInst, NULL);
return OldHook != NULL;
}
else {
if (OldHook && UnhookWindowsHookEx(OldHook))
OldHook = NULL;
return OldHook == NULL;
}
}


//这段代码就是我用来屏蔽Winnt 系统的键盘的钩子处理函数
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *key = (KBDLLHOOKSTRUCT*)lParam;
// 标记
if(wParam == WM_KEYUP){
switch(key->vkCode){
case 0x11: // ctrl
case 0xa2: // left ctrl
case 0xa3: // right ctrl
ctrldown = false; return 0;
}
}

if(ctrldown){
switch(key->vkCode){
case VK_ESCAPE:
case VK_MENU:
case VK_LMENU: // left alt
case VK_RMENU: // right alt
case 0x2e: // delete
case 0x6e: // numpad delete
return 1;
case VK_SHIFT:
case VK_SPACE:
case VK_LSHIFT:
case VK_RSHIFT:
case 0x11: // ctrl
case 0xa2: // left ctrl
case 0xa3: // right ctrl
return 0;
}
}
if(wParam == WM_KEYDOWN){
switch(key->vkCode){
case 0x11: // ctrl
case 0xa2: // left ctrl
case 0xa3: // right ctrl
ctrldown = true; return 0;
}
}
//标记结束 从标记开始到这里是我用来判断用户是否按下了Ctrl+space 和Ctrl+Shift 等用来切换输入法的代码
//以防止锁定键盘时,用户连输入法都不能切换而添加的
if(key->flags == 32 || key->flags==33 ) return 1; //32 33 是左右alt 键(好像是,记不清了^_^)

//下面就是需要响应得键值
switch(key->vkCode){
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x08:
case 0x09:
case 0x0c:
case 0x0d:
case 0xa0: // left shift
case 0xa1: // right shfit
case 0x10: // shift
case 0x14: // caps lock
case 0x1b: // escape
case 0x20:
case 0x21:
case 0x22:
case 0x23:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x2c: // print screen
case 0x2d:
case 0x2e:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x41: //a
case 0x42: //b
case 0x43: //c
case 0x44: //d
case 0x45: //e
case 0x46: //f
case 0x47: //g
case 0x48: //h
case 0x49: //i
case 0x4a: //j
case 0x4b: //k
case 0x4c: //l
case 0x4d: //m
case 0x4e: //n
case 0x4f: //o
case 0x50: //p
case 0x51: //q
case 0x52: //r
case 0x53: //s
case 0x54: //t
case 0x55: //u
case 0x56: //v
case 0x57: //w
case 0x58: //x
case 0x59: //y
case 0x5a: //z
case 0x60: // 0
case 0x61: // 1
case 0x62: //....
case 0x63:
case 0x64:
case 0x65:
case 0x66:
case 0x67:
case 0x68:
case 0x69: //9
case 0x6a: //*
case 0x6b: //+
case 0x6c: //分隔符
case 0x6d: //-
case 0x6e: //.
case 0x6f: // /
case 0x70: // F1
case 0x71: // F2
case 0x72: // F3
case 0x73: // F4
case 0x74: // F5
case 0x75: // F6
case 0x76: // F7
case 0x77: // F8
case 0x78: // F9
case 0x79: // F10
case 0x7a: // F11
case 0x7b: // F12
case 0x90: // num lock
case 0xba: // us ; :
case 0xbb: // us +
case 0xbc: // us ,
case 0xbd: // us -
case 0xbe: // us .
case 0xbf: // us ?
case 0xc0: // us ~
case 0xdb: // us [ {
case 0xdc: // us \ |
case 0xdd: // us ] }
case 0xde: // us ' "
//这些就是键盘虚拟键值,需要响应的都写在上边了
return CallNextHookEx(OldHook,code,wParam,lParam);
default :
return 1;
}
}

farfh 2003-07-11
  • 打赏
  • 举报
回复
晕,这个问题好象关心的人很多啊,用替换dll禁止ctrl+alt+del好象有闪屏的,我好象见过一个采用注入dll的,没有闪屏的,原理也差不多,不过我是直接用注册表,:)
xuv2002 2003-07-10
  • 打赏
  • 举报
回复
同意ybluo 不需要使用钩子,只需要捕捉到按键消息,然后根据消息处理就行
一般有两种方法
1: 通过Application->OnMessage 事件来屏蔽消息
.h
void __fastcall MyMessage(MSG&,bool&);
.cpp
Application->OnMessage = MyMessage;
void __fastcall TForm1::MyMessage(MSG& msg,bool& Handled)
{
if(msg.message==WM_KEYDOWN){
int key = (int) msg.wParam;
if(key==78&&GetAsyncKeyState(VK_CONTROL)<0) Handled = true;
else Handled = false;
//GetAsyncKeyState(VK_CONTROL) 是判断Ctrl键是否是按下状态,返回小于0 表示按下
//78 是'N'的键值,其他的稍作添加就可以了
}else
Handled = false;
}
2 跟ybluo的讲法一样
.h
TWndMethod OldProc;
void __fastcall NewProc(TMessage &msg);
.cpp
OldProc = CppWebBrowser1->WindowProc;
CppWebBrowser1->WindowProc = NewProc;

void __fastcall TForm1::NewProc(TMessage &msg)
{
switch(msg.Msg){
case WM_CHAR:
case WM_KEYDOWN:
case WM_KEYUP:{
int key = msg.WParam;
if(key==78&&GetAsyncKeyState(VK_CONTROL)<0){ // 78 为 n 键值
//屏蔽消息,不处理
}else
OldProc(msg);
}break;
default:
OldProc(msg);
break;
}
}

Keng 2003-07-10
  • 打赏
  • 举报
回复
怎么屏蔽alt+tab啊?
又出现新问题。。还有屏蔽ctrl+alt+del
Keng 2003-07-10
  • 打赏
  • 举报
回复
晕。。还有这样玩的啊。。我没有玩死啊。
xuv2002(XuWei)兄说的第一中方法可以。。因为在消息处理过程中先通过窗体然后在传递给控件。所以被拦截下来。。第2中方法其实没有什么效果因为在控件处理到消息的时候也就是ctrl+n发生的时候拦截没有起到作用。
ybluo 2003-07-10
  • 打赏
  • 举报
回复
没有必要用Hook,重载WindowProc就可以了,WindowProc 中处理键盘消息是对Ctrl+n ,,Ctrl+b 进行屏蔽。
加载更多回复(1)

1,221

社区成员

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

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