GetForegroundWindow() 更改时是否会触发任何系统事件?

2024-01-17

我正在开发一个应用程序,需要获取应用程序运行时处于活动状态的窗口名称,目前我每半秒执行一次对 GetForegroundwindow() 的调用,但这几乎不准确,我不想把它以 100 毫秒为间隔,我认为这很糟糕而且不准确,有没有任何系统事件可以为我做到这一点?

Thanks.


- 更新 -

你可以使用设置WindowsHookEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx监视当前桌面,但这在托管代码中不起作用。相反,您必须使用设置WinEventHook http://msdn.microsoft.com/en-us/library/dd373640%28v=vs.85%29.aspx.

您曾问过如何使用设置WinEventHook http://msdn.microsoft.com/en-us/library/dd373640%28v=vs.85%29.aspxp/调用方法。这是你的答案:

首先确保此行位于代码文件的顶部:

Imports System.Runtime.InteropServices

接下来,声明调用该调用所需的所有内容:

Public Const WINEVENT_OUTOFCONTEXT = &H0  
'' Events are ASYNC

Public Const WINEVENT_SKIPOWNTHREAD = &H1  
'' Don't call back for events on installer's thread

Public Const WINEVENT_SKIPOWNPROCESS = &H2  
'' Don't call back for events on installer's process

Public Const WINEVENT_INCONTEXT = &H4  
'' Events are SYNC, this causes your dll to be injected into every process

    Public Declare Function SetWinEventHook Lib "user32.dll" _
       (eventMin As UInteger, _
        eventMax As UInteger, _
        hmodWinEventProc As IntPtr, _
        lpfnWinEventProc As IntPtr, _
        idProcess As UInteger, _
        idThread As UInteger, _
        dwflags As UInteger) As IntPtr

    Public Declare Function UnhookWinEvent Lib "user32.dll" _
        (hWinEventHook As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean

    Public Delegate Sub WinEventProc( _
          hWinEventHook As IntPtr, _
          [event] As UInteger, _
          hwnd As IntPtr, _
          idObject As Integer, _
          idChild As Integer, _
          dwEventThread As UInteger, _
          dwmsEventTime As UInteger)

接下来,您将一个函数和一个新变量声明为函数,并带有该函数的地址:

    Public Sub EventCallBack( _
      hWinEventHook As IntPtr, _
      [event] As UInteger, _
      hwnd As IntPtr, _
      idObject As Integer, _
      idChild As Integer, _
      dwEventThread As UInteger, _
      dwmsEventTime As UInteger)

' Some code goes here
    End Sub

    Private eventProc As New WinEventProc(AddressOf EventCallBack)
    Private hEventHook As IntPtr

最后,将它们连接在一起,并传递以下代码行来创建挂钩(0 和 255 是任意数字,将它们替换为您想要观看的最小和最大消息代码):

hEventHook = SetWinEventHook(0, _
                             255, _
                             IntPtr.Zero, _
                             Marshal.GetFunctionPointerForDelegate(eventProc), _
                             0, _
                             0, _
                             WINEVENT_OUTOFCONTEXT)

当您的程序完成时,将以下行添加到应用程序终止事件或表单的 Dispose 或 Finalize 方法中:

        UnhookWinEvent(hEventHook)

这在我的测试应用程序上按预期运行。

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

GetForegroundWindow() 更改时是否会触发任何系统事件? 的相关文章

  • 我仍然没有获得代表

    使用委托不是可以帮助处理一些异步情况吗 我尝试了以下操作 但我的用户界面仍然挂起 你到底什么时候使用代表 Public Class Form1 Private Delegate Sub testDelegate Private Sub Bu
  • 如何在 VB.NET 中实现包含结构体参数的 C# 委托?

    给定 C 中的以下委托定义 struct Dummy delegate int ReceiveDummy in Dummy dummy 如何将 VB Net 子程序分配给 ReceiveDummy 类型 以下两个函数定义都会失败 并出现错误
  • 使用新数据输入自动更新图表

    我的图表从 DataGridView 加载数据 如果将新值插入到 DataGridView 中 我希望自动使用新数据更新图表 我的图表必然是table1 and table2在我的 DataGridView 中 它从 DataTable 获
  • 更改数据网格列顺序或索引

    这是我无法相信我无法弄清楚的事情 请告诉我我错过了一些简单的事情 我有一个数据网格 我用 LINQ 填充它以及一个自定义类来向其中添加数据 之后 我需要按特定顺序排列数据 它似乎忽略了我 如何更改列属性 例如索引等 这是我正在使用的 LIN
  • 为什么 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
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • VB.NET 是否优化字符串文字的串联?

    如同this https stackoverflow com questions 288794 does c optimize the concatenation of string literals问题 但对于 VB NET 来说 因为我
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht
  • 表单上的 KeyEvents 只能与 CTRL 结合使用

    Code Private Sub KeyHandling ByVal sender As Object ByVal e As System Windows Forms KeyEventArgs Handles Me KeyDown Sele
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 使用正则表达式验证器上传文件不适用于仅 Firefox IE

    我有一个带有 RegularExpressionValidator 的 FileUpload 和以下验证表达式 a zA Z 2 w w w gif jpg JPG JPEG GIF jpeg png bmp 3dm 3dmf ai drw
  • DataGridView 使用 Structure 和 LINQ 来排序 txt 文件

    当我的程序出现问题时 我能够将所有数据拉入网格并进入正确的列 行 但是 我相信我的 LINQ 查询是错误的 它没有使第三列正确划分并插入正确的数据 我的结果 https gyazo com 0f307a10dff4c015a361708ec
  • 如何使用 winforms 在 vb.net 中制作大型按钮网格(24x20 或类似)?

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

    我有一个单选按钮列表 其中列出了不同的业务类别 最后一个选项是Other类别 当用户选择Other类别 我希望能够启用一个文本框 用户可以输入更多信息来解释Other选择 目前 我正在尝试 If rblCategory SelectedIn
  • 无法在 VB MVC 应用程序中创建 HtmlHelper 方法

    我无法弄清楚以下代码中缺少什么 我有一个应该添加 虚拟 辅助扩展的方法 Imports System Runtime CompilerServices Namespace HtmlHelpers Public Module HelpExte
  • 如何创建未定义的循环计数

    我正在尝试创建一个程序 它将循环遍历所有字母 我想要例如显示aaaa then aaab to aaaz then aaba依此类推zzzz 问题是 如何让用户输入字母计数 这是我的代码 只有 3 个字母 Dim abc As String
  • vb.net HtmlAgilityPack 在 div 之后插入字符串

    我试图在 div 末尾直接插入一些我自己的 html 这个 div 里面有其他 div Dim HtmlNode As HtmlNode HtmlNode CreateNode span class Those were the frien
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P

随机推荐