在停用c#wpf后重新激活窗口

时间:2015-06-30 04:47:29

标签: c# wpf

我正在构建一个屏幕捕获应用程序,尝试在另一个(第三方)应用程序上记录鼠标点击的屏幕截图。我正在编写一个具有透明背景的C#WPF应用程序,可以通过“mousedown”事件“点击”(因此用户仍然可以在另一个应用程序上执行任务)来触发屏幕捕获。这在第一次完美地工作,但是,当用户“点击”我的应用程序时,它将其停用。在Window_Deactivate事件中,我使用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");  
    }

}

1 个答案:

答案 0 :(得分:1)

不,没有办法去钢铁&#34;专注,

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

在我看来,您使用的是错误的技术,在其他应用程序中检测操作的解决方案是hooks (MSDN link)

具体来说,WH_MOUSE钩子让你在其他应用程序处理它们之前查看鼠标事件并做你想做的任何事情。

请注意,安装一个钩子会将你的DLL注入到另一个进程中,因此钩子代码不能用.net编写(因为在另一个进程中没有等待随机运行的运行时)代码),它必须使用一些进程间通信系统的王来与您的应用程序通信,以便它可以响应。