2011-06-16 29 views
0

我有一个情况我需要捕捉的WindowState另一个窗口的变化(这是不是我的应用程序拥有的,我没有写的。我认为它是用C++编写的)。C#:捕获的WindowState其他应用程序的变化(在C/C写道++我认为)

其实我使用一个单独的线程在那里我经常做GetWindowState和火灾自定义事件时该值发生变化(我有窗口的句柄),但我想知道是否有更好的方法

谢谢,

PS 我使用的winform如果能以任何方式

回答

2
//use this in a timer or hook the window 
//this would be the easier way 
using System; 
using System.Runtime.InteropServices; 

public static class WindowState 
{ 
    [DllImport("user32")] 
    private static extern int IsWindowEnabled(int hWnd); 

    [DllImport("user32")] 
    private static extern int IsWindowVisible(int hWnd); 

    [DllImport("user32")] 
    private static extern int IsZoomed(int hWnd); 

    [DllImport("user32")] 
    private static extern int IsIconic(int hWnd); 

    public static bool IsMaximized(int hWnd) 
    { 
     if (IsZoomed(hWnd) == 0) 
      return false; 
     else 
      return true; 
    } 

    public static bool IsMinimized(int hWnd) 
    { 
     if (IsIconic(hWnd) == 0) 
      return false; 
     else 
      return true; 
    } 

    public static bool IsEnabled(int hWnd) 
    { 
     if (IsWindowEnabled(hWnd) == 0) 
      return false; 
     else 
      return true; 
    } 

    public static bool IsVisible(int hWnd) 
    { 
     if (IsWindowVisible(hWnd) == 0) 
      return false; 
     else 
      return true; 
    } 

} 
+0

当然这假定你知道如何获得窗口的句柄。如果你不只是阅读Win32 API的教程。特别是FindWindow和FindWindowEx函数。 API间谍也很有用。检查我们的patorjk.com,他们有免费的API间谍。 – murktinez

+0

我没有看到这里的时候,我问怎么** **捕捉变化的WindowState,没怎么检查它是更容易 –

+0

如果在定时器使用这个类,保存窗口状态,每次计时器,然后执行你会知道窗口状态何时改变。这很简单。如果你试图阻止一个窗口的状态被改变,那是不一样的,而你需要更清楚一些。我公司可提供的代码要做到这一点,以及 – murktinez

1

您可以钩与WNDPROC和拦截的邮件。您可以将DLL注入到目标进程中,使用调试权限打开进程或将全局钩子设置为WH_CALLWNDPROC。

+0

这两者都不能用C#来完成。 –

+0

那么它不是一个问题,如果我必须写在C++,问题的东西,但是我想的太复杂了这样一个工具,我试图发展... –

+0

@Hans,可以互操作使用(P /调用)用C#实现这样的事情。 – foxy

相关问题