在它之后重新激活窗口';s已停用c#wpf

本文关键字:c#wpf 窗口 之后 新激活 激活 | 更新日期: 2023-09-27 18:00:23

我正在构建一个屏幕捕获应用程序,尝试记录鼠标在另一个(第三方)应用程序上点击的屏幕截图。我正在编写一个具有透明背景的C#WPF应用程序,该应用程序可以通过"mousedown"事件"点击"(这样用户仍然可以在另一个应用程序上执行任务)来触发屏幕捕获。然而,当用户第一次"点击"我的应用程序时,它会将其停用。在Window_Dactivate事件中,我使用Window.Activate()方法尝试重新激活我的应用软件,但它只会使任务栏上的应用软件图标闪烁,而不会重新激活整个应用程序/窗口。

每次我的窗口被停用时,有没有办法从第三方应用程序"窃取"活动窗口?

注意:Console.Writeline("Ater - Window is active?....")返回false,代码从不进入异常。

XAML:

<Window Title=" Screen Capture" AllowsTransparency="True"
    WindowStyle="None" Background="{x:Null}" 
    Deactivated="Window_Deactivated" Activated="Window_Activated">

C#:

private void Window_Deactivated(object sender, EventArgs e) 
{
    Console.WriteLine("Window deactivated");
    Window window = (Window)sender;
    Console.WriteLine("Window Handle: {0}", windowHandle);
    try
    {
        Console.WriteLine("Window {0}", window);
        window.Activate();
        window.Focus();
        Console.WriteLine("After - Window is active? {0}", window.IsActive);
    }
    catch (Exception)
    {   
        Console.WriteLine("Window Activation FAILED");  
    }
}

在它之后重新激活窗口';s已停用c#wpf

不,没有办法"钢铁"聚焦,

尝试这样做只会闪烁托盘图标的原因是,在过去的应用程序中,它总是用来强化焦点(因为每个人都认为他/她自己的应用程序比用户正在做的更重要)-这真的很烦人,所以MS阻止了焦点强化

在我看来,你使用了错误的技术,在其他应用程序中检测操作的解决方案是挂钩(MSDN链接)

具体来说,WH_MOUSE钩子允许您在其他应用程序处理鼠标事件并执行任何您想要的操作之前查看鼠标事件。

请注意,安装钩子会将您的DLL注入到另一个进程中,因此钩子代码无法在.net中写入(因为另一个过程中没有.net运行时,只是在等待运行随机代码),并且它必须使用某种进程间通信系统来与您的应用程序对话,以便它能够做出响应。