全局动作事件监听器是一种能够捕获应用程序或系统中广泛发生的事件(如键盘快捷键、鼠标手势、系统级操作等)的编程机制。它不同于局部事件监听器,因为它不局限于特定控件或组件,而是可以响应整个应用甚至系统范围内的事件。
// 监听全局键盘事件
document.addEventListener('keydown', function(event) {
console.log('按下的键:', event.key);
// 阻止默认行为(如防止F5刷新页面)
if(event.key === 'F5') {
event.preventDefault();
}
});
// 监听全局鼠标点击事件
document.addEventListener('click', function(event) {
console.log('点击位置:', event.clientX, event.clientY);
});
// 使用AWT的全局键盘监听
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if (event instanceof KeyEvent) {
KeyEvent keyEvent = (KeyEvent) event;
System.out.println("按键: " + KeyEvent.getKeyText(keyEvent.getKeyCode()));
}
}
}, AWTEvent.KEY_EVENT_MASK);
from pynput import keyboard, mouse
# 键盘监听
def on_press(key):
print(f'按键 {key} 被按下')
keyboard_listener = keyboard.Listener(on_press=on_press)
keyboard_listener.start()
# 鼠标监听
def on_click(x, y, button, pressed):
print(f'鼠标在 ({x}, {y}) 点击了 {button}')
mouse_listener = mouse.Listener(on_click=on_click)
mouse_listener.start()
// 全局键盘钩子
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class GlobalKeyboardHook
{
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private LowLevelKeyboardProc _proc;
private IntPtr _hookID = IntPtr.Zero;
public GlobalKeyboardHook()
{
_proc = HookCallback;
_hookID = SetHook(_proc);
}
private IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (var curProcess = System.Diagnostics.Process.GetCurrentProcess())
using (var curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
// Windows API声明
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
原因:权限不足或事件被阻止 解决:
原因:监听器处理逻辑过于复杂 解决:
原因:不同操作系统事件机制不同 解决:
根据你的具体开发环境和需求,选择适合的实现方式,并注意处理好上述潜在问题。
没有搜到相关的文章