我正在开发的桌面应用程序需要知道在运行应用程序时哪些窗口处于活动状态.目前它每250毫秒执行一次GetForegroundWindow()
呼叫user32.dll
.方法不是很准确.
是否有任何Windows(WINAPI?)事件在每次活动(聚焦)窗口更改时触发?我想订阅我的回调函数.
谢谢.
有没有办法通知焦点何时从任何窗口更改到另一个窗口(甚至在Windows应用程序之间),以便我可以在用户更改焦点时立即调用我的委托?
我一直在想我可能只需要进行民意调查:( :(每1秒钟调用GetForegroundWindow但我真的不想那样做).
我有一个应用程序,作为托盘图标坐在系统托盘中.我已经注册了一个热键,当按下它时将捕获任何应用程序中的当前文本选择,即使在Web浏览器中也是如此.
我的方法是发送密钥组合{Ctlr + C}来复制文本.然后访问剪贴板并使用我自己的应用程序中的文本.
我在VB.NET中编程,但是在C#中的任何帮助,甚至是使用Win32_Api的C++都会受到高度赞赏.
我使用AutoHotkey,在那里,我有一个访问剪贴板文本的脚本,工作正常.
Pause::
clipboard = ; Start off empty to allow ClipWait to detect when the text has arrived.
Send ^c
ClipWait, 2 ; Wait for the clipboard to contain text.
if ErrorLevel
{
;Do nothing after 2 seconds timeout
return
}
Run https://translate.google.com/#auto/es/%clipboard%
return
Run Code Online (Sandbox Code Playgroud)
由于AutoHotkey是开源的,我下载了代码并尝试尽可能多地复制ClipWait的行为.
我的代码大多数时间都在工作,但有时会有一个重要的延迟.我无法访问剪贴板和win32函数IsClipboardFormatAvailable()为While保持返回False.当我尝试从可编辑的TextBox中专门从Google Chrome复制时,会发生这种情况.
我尝试了很多不同的东西,包括使用.Net Framework剪贴板类.我读到的问题可能是运行命令的线程没有设置为STA,所以我做到了.在我的绝望中,我也放了一个计时器,但没有完全解决问题.
我也读了一个钩子监视剪贴板的选项,但我想避免这种情况,除非它是唯一的方法.
这是我的VB.NET代码:
Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Threading
Imports Hotkeys
Public Class Form1
Public m_HotKey As Keys = Keys.F6
Private Sub RegisterHotkeys() …
Run Code Online (Sandbox Code Playgroud)