如何跟踪应用程序z顺序/焦点?

时间:2009-08-11 13:32:15

标签: c# windows

我想谈谈在申请之前使用的应用程序,如何找出最后关注的应用程序?

3 个答案:

答案 0 :(得分:1)

我正在寻找同样的东西 - 我有一个应用程序在屏幕上保持打开状态,一旦用户进入三个第三方应用程序之一,用户就可以在我的应用程序上调用一个按钮。

当他们点击我的应用程序上的按钮时,我需要确定他们上次使用的三个应用程序中的哪一个,以便知道要与哪个数据库通信。我已经走下了查看GetForeGroundWindow和GetWindow的路线,但是我从GetWindow获得的Window句柄总是引用一个标题为M的窗口。我使用了Managed Windows API工具中的Winternal Explorer工具,我可以找到M句柄返回,它是我追求的过程的“孩子” - 但是从这个句柄我不能得到进程名称。

我已经使用简单的Windows窗体完成了一个小示例应用程序 - 然后我开始使用它然后使记事本成为焦点,然后单击我的按钮并获得句柄 - 但是当查看所有进程的MainWindowHandle时,它没有列出,但使用Winternal Explorer我可以看到这是记事本过程的子过程。

有关为什么我只返回此子进程句柄而不是实际进程句柄的任何建议?

示例代码如下 - 在Windows XP sp 3计算机上运行

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestWindowsAPI
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr thisWindow = GetForegroundWindow();
            IntPtr lastWindow = GetWindow(thisWindow, 2);

            tbThisWindow.Text = thisWindow.ToString();
            tbLastWindow.Text = lastWindow.ToString();
        }
    }
}

答案 1 :(得分:0)

在创建自己的应用程序窗口之前,请调用GetForegroundWindow。 否则调用GetWindow(your_hwnd,GW_HWNDNEXT)来查找指定的下一个窗口。

答案 2 :(得分:0)

尚无现成的方法来获取Z-Order命令在Windows上打开的应用程序列表。

下面的代码在GetWindowsInOrder方法中实现了这一点。要找到您的应用程序,请使用Process.GetCurrentProcess().MainWindowHandle作为方法返回的字典键。然后,您可以知道谁来了。

该方法返回的字典 Window Handle 作为其键,并以 Window Name 作为其值。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

public static class WindowsApi
{
    public static Dictionary<IntPtr, string> GetWindowsInOrder()
    {
        return Process
            .GetProcesses()
            .Where(process => process.MainWindowHandle != IntPtr.Zero)
            .Select(process => process.MainWindowHandle)
            .OrderBy(GetWindowZOrder)
            .ToDictionary(hWnd => hWnd, GetWindowText);
    }

    public static int GetWindowZOrder(IntPtr hWnd)
    {
        var zOrder = -1;
        while ((hWnd = GetWindow(hWnd, 2 /* GW_HWNDNEXT */)) != IntPtr.Zero) zOrder++;
        return zOrder;
    }

    public static string GetWindowText(IntPtr hWnd)
    {
        var text = new StringBuilder(255);
        GetWindowText(hWnd, text, text.Capacity);
        return text.ToString();
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

    [DllImport("user32.dll", CharSet = CharSet.None, SetLastError = true)]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
}