Как отследить приложение z-порядка / фокуса? - PullRequest
0 голосов
/ 11 августа 2009

Я хочу поговорить с приложением, которое использовалось непосредственно перед моим приложением, как я могу узнать, какое приложение имело последний фокус?

Ответы [ 2 ]

1 голос
/ 19 января 2010

Я ищу то же самое - у меня есть приложение, которое остается открытым на экране, и пользователь может вызвать кнопку в моем приложении после того, как он сделал запись в одном из трех сторонних приложений.

Когда они нажимают кнопку в моем приложении, мне нужно определить, какое из трех приложений они использовали в последний раз, чтобы узнать, с какой базой данных можно общаться. Я пошел по пути просмотра 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();
        }
    }
}
0 голосов
/ 11 августа 2009

Прежде чем создавать собственное окно приложения, вызовите GetForegroundWindow. В противном случае вызовите GetWindow (your_hwnd, GW_HWNDNEXT), чтобы найти следующее окно ниже указанного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...