确定流程是否在最前面

时间:2017-03-27 16:05:06

标签: c# wpf

我正在WPF中编写一个附加到skype的应用程序,随之移动并发送到后面/前面。我唯一缺少的是每当skype被带到前面时,我需要将我的WPF应用程序发送到前面。

我正在考虑的方法是,检测我的桌面上Skype何时进入最顶端(在Z-Order中)并将我的应用程序发送到前面。

这就是我所拥有的: 用于连接过程

public List<Process> skypeProcess;
public IntPtr ptr;
public Rect skypeRect;

public SkypeWindowPosition()
{
    skypeProcess = Process.GetProcessesByName("skype").ToList();

    ptr = skypeProcess[0].MainWindowHandle;
    SetForegroundWindow(ptr);
    skypeRect = new Rect();
    GetWindowRect(ptr, ref skypeRect);
}

我想从user32.dll使用GetTopWindow,但它不能按我想要的方式工作。

我试过了:

if (lyncWin.ptr == LyncWindowPosition.GetTopWindow(new IntPtr(0)))
{
    Console.WriteLine("Yes");
}
else
{
    Console.WriteLine("No");
}

但即使skype位于顶部,它也会评估为“No”。

我也有:

int GetZOrder(IntPtr hWnd)
{
    var z = 0;
    for (var skypeHandle = hWnd; skypeHandle != IntPtr.Zero; skypeHandle = LyncWindowPosition.GetWindow(skypeHandle, 3)) z++;
    return z;
}

它告诉我Skype的Z位置,但Z会有所不同,具体取决于活动窗口的数量。

任何有关如何确定skype是否位于最佳位置的帮助,或任何更好的方法都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

我解决了自己的问题:

原来我应该使用GetForegroundWindow()

所以我做了:

if (LyncWindowPosition.GetForegroundWindow().GetHashCode() == lyncWin.ptr.GetHashCode())
{
    window.Topmost = true;
    window.Topmost = false;
}