c语言中映射的用法,如何使用LowLevelKeyboardProc重新映射c中的键盘键?

这是一种将Alt重新映射到Ctrl的方法很有效.不要忘记默认参数

如果你没有定义wParam可以切换回alt,可能只是我的电脑试一试

include iostream

include windows.h

using namespace std;

HHOOK hHook = 0;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

{

if (nCode == HC_ACTION)

{

KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;

if (p->vkCode == VK_LMENU) // VK_LMENU = ALT key

{

switch (wParam){

case WM_SYSKEYDOWN :{ // use SYSKEYDOWN

cout << "Key down" << endl;

keybd_event(VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | 0, 0 );

break;

}

case WM_KEYUP: // use regular keyup

{

cout << "Key up" << endl;

keybd_event( VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

return 1;

break;

}

default:

wParam = WM_SYSKEYDOWN; // if you do not specify it changes back to alt

break;

}

return 1;

}

}

return CallNextHookEx(hHook, nCode, wParam, lParam);

}

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)

{

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, &LowLevelKeyboardProc, hThisInstance, NULL);

if (hHook == NULL)

{

cout << "Error" << endl;

return 1;

}

MSG messages;

while (GetMessage (&messages, NULL, 0, 0))

{

TranslateMessage(&messages);

DispatchMessage(&messages);

}

return messages.wParam;

}

在C#使用全局鼠标、键盘Hook需要使用Win32 API来实现,以下是一个简单的示例代码: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace GlobalHookDemo { class Program { private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", SetLastError = true)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); private const int WH_KEYBOARD_LL = 13; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; static void Main(string[] args) { _hookID = SetHook(_proc); Console.WriteLine("Global keyboard hook installed."); Console.WriteLine("Press any key to exit."); Console.ReadKey(); UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)0x100) { int vkCode = Marshal.ReadInt32(lParam); Console.WriteLine((Keys)vkCode); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } } } ``` 这个示例代码可以监听全局键盘事件并输出码。如果需要监听鼠标事件,可以使用`SetWindowsHookEx`函数的第一个参数`idHook`设置为`WH_MOUSE_LL`。需要注意的是,全局Hook会影响系统性能,使用时需要谨慎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值