Я ищу то же самое - у меня есть приложение, которое остается открытым на экране, и пользователь может вызвать кнопку в моем приложении после того, как он сделал запись в одном из трех сторонних приложений.
Когда они нажимают кнопку в моем приложении, мне нужно определить, какое из трех приложений они использовали в последний раз, чтобы узнать, с какой базой данных можно общаться. Я пошел по пути просмотра GetForeGroundWindow и GetWindow, однако дескриптор окна, который я получаю из GetWindow, всегда ссылается на окно с заголовком M. Я использовал инструмент Winternal Explorer из инструментов Managed Windows API и могу найти, что дескриптор 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();
}
}
}