从应用程序外部记录按键(VB.net)[重复]

2024-01-18

我正在制作一个程序,它使用键盘记录器的功能来确定趋势,问题是我无法制作键盘记录器,我已经完成了大部分内容,但当表单失去焦点时我无法按下按键。 .我见过有人提到键盘和消息挂钩,但我找不到任何示例或理解任何有关它的文档。

Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    Using sw As StreamWriter = File.AppendText(Path) ' Open keylog file for editing
        If Asc(e.KeyChar) = 13 Then ' If key pressed is Enter...
            sw.Write("|Enter|") ' Append "|Enter|"
        ElseIf Asc(e.KeyChar) = 8 Then ' If key pressed is Backspace...
            sw.Write("|Backspace|") ' Append "|Backspace|"
        Else
            sw.Write(e.KeyChar) ' Otherwise append character
        End If
    End Using
End Sub

正如您所看到的,我记录了按键和所有内容,我只需要能够在应用程序最小化或失焦时按下按键。

提前致谢。


这工作完美...

Imports System.IO

Public Class Form1

    Dim Path As String = "C:\Users\user\Desktop\keys.log" ' Keylog file location
    Private WithEvents kbHook As New KeyboardHook

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If My.Computer.FileSystem.FileExists(Path) = False Then ' If keylog file doesn't exist...
            File.CreateText(Path) ' Create keylog file
        End If
    End Sub

    Private Sub kbHook_KeyDown(ByVal Key As Keys) Handles kbHook.KeyDown
        Using sw As StreamWriter = File.AppendText(Path) ' Open keylog file for editing
            sw.Write(Key.ToString) ' Append character
        End Using
    End Sub
End Class

我将 KeyboardHook 类放在一个单独的文件中,以便当我需要修复 Form1 类中的其他内容时,将其排除在外。我建议这样做,除非您不需要向程序中添加任何其他内容。

Imports System.Runtime.InteropServices

Public Class KeyboardHook

    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
    Private Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As KBDLLHookProc, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
    End Function
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
    Private Overloads Shared Function CallNextHookEx(ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    End Function
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
    Private Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean
    End Function

    <StructLayout(LayoutKind.Sequential)>
    Private Structure KBDLLHOOKSTRUCT
        Public vkCode As UInt32
        Public scanCode As UInt32
        Public flags As KBDLLHOOKSTRUCTFlags
        Public time As UInt32
        Public dwExtraInfo As UIntPtr
    End Structure

    <Flags()>
    Private Enum KBDLLHOOKSTRUCTFlags As UInt32
        LLKHF_EXTENDED = &H1
        LLKHF_INJECTED = &H10
        LLKHF_ALTDOWN = &H20
        LLKHF_UP = &H80
    End Enum

    Public Shared Event KeyDown(ByVal Key As Keys)
    Public Shared Event KeyUp(ByVal Key As Keys)

    Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const HC_ACTION As Integer = 0
    Private Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101
    Private Const WM_SYSKEYDOWN = &H104
    Private Const WM_SYSKEYUP = &H105

    Private Delegate Function KBDLLHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

    Private KBDLLHookProcDelegate As KBDLLHookProc = New KBDLLHookProc(AddressOf KeyboardProc)
    Private HHookID As IntPtr = IntPtr.Zero

    Private Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
        If (nCode = HC_ACTION) Then
            Dim struct As KBDLLHOOKSTRUCT
            Select Case wParam
                Case WM_KEYDOWN, WM_SYSKEYDOWN
                    RaiseEvent KeyDown(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
                Case WM_KEYUP, WM_SYSKEYUP
                    RaiseEvent KeyUp(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
            End Select
        End If
        Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
    End Function

    Public Sub New()
        HHookID = SetWindowsHookEx(WH_KEYBOARD_LL, KBDLLHookProcDelegate, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
        If HHookID = IntPtr.Zero Then
            Throw New Exception("Could not set keyboard hook")
        End If
    End Sub

    Protected Overrides Sub Finalize()
        If Not HHookID = IntPtr.Zero Then
            UnhookWindowsHookEx(HHookID)
        End If
        MyBase.Finalize()
    End Sub

End Class
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从应用程序外部记录按键(VB.net)[重复] 的相关文章

  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 如何在 VB.NET 中单击按钮切换表单语言?

    我想创建本地化应用程序并想要实现语言切换器 例如特殊按钮 我使用 Visual Studio 2010 Express VB NET 我创建了带有一个标签和一个按钮的简单测试应用程序 我将表单的属性 Localized 设置为 True 并
  • 通过访问硬盘序列号来保护软件[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想获得VB NET或VB代码来在启
  • 为什么我的 .Net 对象不可序列化?

    我有一个继承自 System Data DataTable 的 MyDataTable 类 我已经在我的类中实现了 ISerialized 并且有一个 公共覆盖子 GetObjectData 但是 当我尝试序列化 MyDataTable 的
  • 如何在 vb.net 中更改 DateTimePicker 的日期格式

    如何更改 vb net 中 DateTimePicker 的日期格式 以便日期以 dd mm 1990 格式显示 没有任何时间值 我尝试将格式更改为 短 虽然这提供了我需要的日期格式 但它不会删除时间 您需要将 DateTimePicker
  • 跨线程操作无效 VB.NET

    我浏览了该网站 发现与该主题相关的问题是针对 C 的 我正在维护的应用程序是用 VB NET 编写的 因此 如果我忽略了一个问题 我深表歉意 这是我调用我的线程的地方 Private Sub saveBtn Click ByVal send
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht
  • 将 MIME 编码的附件发布到 Ariba Supply Network 时出现问题

    我在尝试使用 VB NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题 我相信我正在格式化我希望正确发布的数据文本 因为它与 Ariba 提供的示例相匹配 我不确定的是我是否正确使用 WebRequest 对象来
  • 命令式代码与声明式代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图理解命令式范例和声明式范例之间的区别 因为我必须对 Visual Basic 进行分类 NET 在不同的范式中 除了面向对象之外
  • VB SQL 语句未选择正确的行

    我试图使用 SELECT 语句在我的数据库中 选择 一个人 但它没有选择正确的人 我也不确定为什么 我正在使用访问数据库 数据库连接代码 Imports System Data OleDb Module Database Connectio
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • 由于继承抽象类而禁用设计器?

    我有一个项目的解决方案 那个项目中有 40 或 50 种形式 我制作了 4 个基本形式 所有其他形式都可以继承 所有 4 个基本表单都继承 System Windows Forms Form 几乎 90 的形式继承了前 2 个基本形式之一
  • 使用正则表达式验证器上传文件不适用于仅 Firefox IE

    我有一个带有 RegularExpressionValidator 的 FileUpload 和以下验证表达式 a zA Z 2 w w w gif jpg JPG JPEG GIF jpeg png bmp 3dm 3dmf ai drw
  • 将字符串转换为双精度 - VB

    VB中有没有一种有效的方法来检查字符串是否可以转换为双精度型 我目前正在尝试将字符串转换为双精度型 然后查看它是否引发异常 但这似乎减慢了我的申请速度 Try if number then format it current CDbl x
  • 如何使用 winforms 在 vb.net 中制作大型按钮网格(24x20 或类似)?

    我正在 vb net WinForms 中制作一个座位预订系统 我需要用户能够选择他们想要使用的座位并改变颜色 这样他们就可以知道它已选择 我开始尝试使用按钮 但 480 个按钮严重减慢了表单的加载时间 然后我尝试了在行 列中带有按钮的数据
  • LinqToSql 声明和实例化 DataContext 最佳实践?

    设置 DataContext 以便在扩展 LinqToSql 类中轻松访问方面的最佳实践是什么 例如 我的 dbml 中有一个 User 实体 我想向该类添加方法 如下所示 Partial Public Class User Public
  • 如何创建未定义的循环计数

    我正在尝试创建一个程序 它将循环遍历所有字母 我想要例如显示aaaa then aaab to aaaz then aaba依此类推zzzz 问题是 如何让用户输入字母计数 这是我的代码 只有 3 个字母 Dim abc As String
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • 下载需要使用 vb.net/c# 进行身份验证的文件?

    与 CSV 文件类似 可以从以下位置下载http download finance yahoo com d quotes csv s RHT 如何下载需要身份验证的文件 我可以简单地使用 My Computer Network Downlo

随机推荐

  • 在 C++ 中前向声明枚举

    我正在尝试做类似以下的事情 enum E void Foo E e enum E A B C 编译器拒绝的 我快速浏览了一下谷歌 共识似乎是 你做不到 这是为什么 说明 2 我这样做是因为我在一个类中有私有方法 该方法采用所述枚举 并且我不
  • 如何在 UITableView 顶部添加一个一起滚动的视图,但滚动后粘在顶部

    我有一个高度为 100 像素的 UIView 位于 UITableView 之上 当我向上滚动时 我希望 UIView 与 UITableView 一起滚动 就好像它是它的一部分一样 当我的 UIView 的 50 像素被隐藏而无法向上滚动
  • nvd3 折线图未正确显示。 (点和阴影区域)

    所以我使用 nvd3 我想在一张折线图中显示 2 条线 我知道代码没问题 因为我正在 nvd3 的实时代码上尝试它并且工作正常 我在很多地方读到 他们在 nvd3 live 代码上使用的代码与 api 不同 因此该图有阴影并且有点 然而 在
  • Kubernetes 和 JVM 内存设置

    In a Kubernetes具有众多微服务的集群 其中一个专门用于Java Virtual Machine JVM 运行Java 1 8数据处理应用程序 直到最近 该 JVM Pod 中运行的作业消耗的 RAM 还不到 1 GB 因此该
  • 加速 numpy 3D 数组的卷积循环?

    沿着 3d numpy 数组的 Z 向量执行卷积 然后对结果进行其他操作 但由于现在实现的原因 速度很慢 是 for 循环让我慢下来还是卷积 我尝试重塑为一维向量并在 1 遍中执行卷积 就像我在 Matlab 中所做的那样 而不使用 for
  • Git 远程分支已删除,但仍然出现在“branch -a”中

    假设我有一个名为coolbranch在我的存储库中 现在 我决定使用以下命令删除它 远程和本地 git push origin coolbranch git branch D coolbranch 伟大的 现在分支真的被删除了 但当我跑步时
  • 获取目录所有者信息

    我的脚本以递归方式获取目录信息 例如目录名称 LastAccessTime LastWriteTime 和大小 我想知道是否可以获取文件夹所有者名称 这是我的脚本 function Get DirSize param Parameter M
  • 渲染 razor 模板时自定义 WebViewPage 注入代码

    我正在尝试创建一个自定义 Razor 视图基类 继承WebViewPage 这将为每个正在渲染的视图模板 包括布局和部分视图 注入一些 HTML 以便我在客户端上有每个 Razor 模板开始位置的引用 对它结束的位置不感兴趣 到目前为止我尝
  • 使用惰性数据表时,另一个组件不会更新/第二个组件数据落后于一个请求

    我有一个 PrimeFacesp dataTable并通过实现启用延迟加载LazyDataModel dataTable 保存搜索结果 因此在执行搜索请求时 搜索服务仅检索所需的 分页 数据 效果很好 当使用 ajax 请求时p comma
  • Matter JS - 物理 - 如何定义重元素,难以被小元素移动

    我一直在努力研究 Matter JS 的物理原理 试图让它们正确 我有两个要素 Matter Bodies rectangle 400 400 113 66 frictionAir 1 friction 1 density 0 5 rest
  • SCons - 非标准位置的标头/库

    我正在尝试使用 SCons 编译一个程序 该程序需要一组我已安装在非标准位置的依赖项 我已将依赖项安装在 home dja ocr 中 现在我正在尝试编译主程序 但不知道如何告诉 SCons 在哪里查找库和标头 我已经尝试过 除其他外 sc
  • 使用 python 循环遍历文本文件列表

    编辑 为了更清楚起见 已更新帖子 但还没有答案有帮助 好吧 我的任务是获取一个文本文件 每行有 4 个条目 分别是名字 姓氏 小时数 工资率 我要做一些计算 并将所有这些信息放入 python 的格式化表中 现在 我已经有了将数据输入表中的
  • 语法高亮的正确正则表达式是什么?

    使用 NSRegularExpression 进行语法高亮的正确正则表达式是什么 必须通过以下测试 code comment code comment code code string code code comment code code
  • FlipView 控件在 Windows Phone 8 SDK 中不可用

    FlipView 控件在 Windows Phone 8 SDK 中不可用 实现类似功能的替代方法是什么 这里有几个选项 如果您只想显示固定数量的 页面 您可以使用Panorama http msdn microsoft com en us
  • 赛普拉斯抛出安全错误

    我目前正在使用 Chrome 74 运行 并尝试使用 Cypress 来测试我的应用程序中的样式指南 当我加载 Cypress 时 它会抛出此错误 安全错误 阻止了来源为 http localhost 3000 的框架 访问跨源框架 请告诉
  • 您为网站推荐哪种 PHP CMS? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在建立一个网站 需要使用 CMS 如果我使用已经制作好的 CMS 我需要能够轻松扩展它 您有推荐的特定 CMS 还是我应该自己制作一个 CM
  • Bootstrap:如何更改容器的宽度?

    我使用Twitter Bootstrap开发了一个具有固定容器类的网站 但现在客户希望网站宽度为1000px而不是1170px 我不使用 less 文件 有没有快速的方法来解决这个问题 这是解决方案 media min width 1200
  • 如何在一个文件中定义一个 C 函数,然后从另一个文件中调用它?

    如果我在文件中定义一个函数func1 c 我想从文件中调用它call c 我怎样才能完成这个任务 您可以在文件中放置该函数的声明func1 h 并添加 include func1 h in call c 然后你会编译或链接func1 c a
  • JMS Serializer 忽略 Knp Paginator 的映射

    我在使用 JMS 序列化程序排除某些 KNP Paginator 属性时遇到问题 首先 它包含在composer json中 jms serializer bundle 0 13 knplabs knp paginator bundle 2
  • 从应用程序外部记录按键(VB.net)[重复]

    这个问题在这里已经有答案了 我正在制作一个程序 它使用键盘记录器的功能来确定趋势 问题是我无法制作键盘记录器 我已经完成了大部分内容 但当表单失去焦点时我无法按下按键 我见过有人提到键盘和消息挂钩 但我找不到任何示例或理解任何有关它的文档