我想谈谈在申请之前使用的应用程序,如何找出最后关注的应用程序?
答案 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);
}