一套键盘如何控制多台电脑?

昨天在群里看见一个小伙伴问一套键盘如何控制多台电脑?正好勾起以前学习Windows时候的乐趣,其实这个也做过,是我的一个朋友需要,实现原理也比较简单,大概就是通过键盘钩子钩住按键,通过Socket发送到其他电脑上,其他电脑开始模拟按键,鼠标也是一样,大概会用法到以下API。

啥是钩子

Windows中的窗口程序是基于消息机制,事件驱动的,根据不同的消息完成不同的功能,钩子就是拦截Windows的某些消息,在这个消息到达指定窗口前会拦截下来,我们可以从中获取我们想要的信息,可以加工改变这个消息,也可以不作处理继续传递下去,还可以强制结束消息的传递。

以前的键盘记录程序也应该用到这个技术,但也有可能更高深,因为现在大部分出名软件都有反钩子技术,如QQ,但TIM好像可以,无法使用普通的技术拦截QQ窗口中输入的密码,反之其他程序可以。

SetWindowsHookEx

最开始我们会通过这个函数来增加一个消息钩子,第一个参数就是安装的钩子类型,有非常多,如果键盘的话我们选择WH_KEYBOARD_LL。

HHOOK SetWindowsHookExA(
  int       idHook,
  HOOKPROC  lpfn,
  HINSTANCE hmod,
  DWORD     dwThreadId
)

其余参数分别是 钩子子程的地址指针、应用程序实例的句柄、与安装的钩子子程相关联的线程的标识符, 如果为0,钩子子程与所有的线程关联,即为全局钩子。

CallNextHookEx

将挂钩信息传递到当前挂钩链中的下一个挂钩过程。

LRESULT CallNextHookEx(
  HHOOK  hhk,
  int    nCode,
  WPARAM wParam,
  LPARAM lParam
)

代码示例

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long
Private Const HC_ACTION = 0

Public Const WH_KEYBOARD_LL As Long = 13
Public Const WM_KEYDOWN As Long = &H100
Public Const WM_KEYUP As Long = &H101
Public Const WM_SYSKEYDOWN As Long = &H104
Public Const WM_SYSKEYUP As Long = &H105
Public Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type

Public hHook As Long
Dim logTv As TextBox

Public Sub EnableHook()
    Set logTv = Form1.Text1
    If hHook = 0 Then
       hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookProc, App.hInstance, 0)
    End If
End Sub
Public Sub FreeHook()
    If hHook <> 0 Then
       Call UnhookWindowsHookEx(hHook)
       hHook = 0
    End If
End Sub
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, lparam As KBDLLHOOKSTRUCT) As Long

    If wParam = WM_KEYDOWN Then
        logTv.Text = logTv.Text & vbCrLf & "键盘按下  " & Chr(lparam.vkCode)

    ElseIf wParam = WM_KEYUP Then
        logTv.Text = logTv.Text & vbCrLf & "键盘抬起  " & Chr(lparam.vkCode)
 
    End If
    logTv.SelLength = Len(logTv.Text)
    HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
 
End Function


在这里插入图片描述

剩下的就是通过Socket发送到其他电脑上,使用keybd_event来模拟键盘按下、抬起。但是这个函数现在貌似被SendInput取代了。SendInput并没有研究过。

void keybd_event(
  BYTE      bVk,
  BYTE      bScan,
  DWORD     dwFlags,
  ULONG_PTR dwExtraInfo
);
当你有多台电脑键盘鼠标放在狭窄的电脑桌上, 当你在每台电脑键盘鼠标之间来回切换而焦头烂额时, 当你为了发送一段文本而不得不使用飞鸽或QQ甚至通过共享文件来时传递时, 你或许需要它:"远程虚拟控制" 这个软件实现了只使用一套键盘鼠标控制最多八台主机的功能, 并能在这些主机之间方便的传送文本内容, 实现在一台电脑上Ctrl + C 在另外一台电脑上Ctrl + V, 完成远程复制功能。 主机之间的切换无需进行任何附加操作, 你只需要将你的鼠标从这个显示移动到另一台显示器, 就如同将输入焦点从一个窗口移动到另一个窗口一样, 当完成鼠标切换后, 键盘也同时将输入焦点切换到相应的主机, 此后的大部分键盘输入操作均只对拥有鼠标的主机有效, 除了(Ctrl + ATL + DEL、WIN + L)这些组合键无法传送, 当按下这些组合键后, 主控机即刻获取输入焦点。 此软件只能在登陆后的默认桌面才可使用, 不能在登陆桌面, 屏保桌面下使用(等待解决这个问题), 在使用时如果系统安装有防火墙软件, 请将本程序加入防火墙的白名单或是相应配制文件中, 让防火墙放过检测。否则可能 给你的使用带来不便。 软件分为主控端和被控端, 可能存在多台被控端, 但是只能有一台主控端, 由主控端向其它被控端发送键盘鼠标指令, 以控制被控端的行为。 将程序分别解压到你每台的电脑上,依据配制说明将一台电脑配制成主控机, 将其它的电脑制成被控机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值