Windows Forms: Установите видимость формы на основе фокуса, который включен во внешнем окне - PullRequest
1 голос
/ 21 сентября 2009

Я хотел бы создать приложение Windows Forms, которое при запуске отображается только один раз, когда другое внешнее окно (notepad.exe) включено / сфокусировано. Любые намеки, я не знаю, с чего начать.

Если моя форма работает, я бы хотел, чтобы она всплывала, когда Блокнот включен, и исчезала, когда Блокнот терял фокус.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2009

Вы можете сделать это просто с помощью вызовов API и таймера. Добавьте эту строку в операторы вашей формы:

using System.Runtime.InteropServices;

Затем добавьте эти декларации в вашу форму:

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, 
    string lpWindowName); 

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

Наконец, поместите Timer в форму и установите для его свойства Enabled значение true. В событие Tick введите этот код:

IntPtr hWndNotepad = FindWindow(null, "Whatever.txt - Notepad");
IntPtr hWndForegroundWindow = GetForegroundWindow();
if (this.Handle != hWndForegroundWindow)
{
    this.Visible = (hWndNotepad == hWndForegroundWindow);
}

Я не тестировал этот код, но он должен работать. Код ищет определенный файл, который будет открыт в Блокноте; другой файл может привести к другому тексту в заголовке, поэтому этот код не будет работать. Я думаю, что если вы измените вызов FindWindow на FindWindow("notepad", null), он будет работать с любым открытым экземпляром Блокнота (это может быть «notepad.exe» - не уверен).

Обновление : если вы хотите, чтобы ваша форма была видимой, если открыт любой экземпляр Блокнота, вы можете вместо этого вставить этот код в событие Tick вашего таймера:

IntPtr hWndForegroundWindow = GetForegroundWindow();
bool NotepadIsForeground = false;
Process[] procs = Process.GetProcessesByName("notepad");
foreach (Process proc in procs)
{
    if (proc.MainWindowHandle == hWndForegroundWindow)
    {
        NotepadIsForeground = true;
        break;
    }
}
if (this.Handle != hWndForegroundWindow)
{
    this.Visible = NotepadIsForeground;
}

И это понадобится вам в директивах using:

using System.Diagnostics;

Тоже не проверял, но у меня сегодня все хорошо, так зачем?

0 голосов
/ 21 сентября 2009

Вы можете попробовать взглянуть на API автоматизации Windows для C #. С их помощью вы сможете просмотреть все открытые окна и найти Блокнот. Я не смотрел на связку API, но лучший базовый сценарий - это событие активации / lostfocus для окна, которое вы можете обработать. В худшем случае, вы можете просто опросить каждые 100 мс или около того и посмотреть, имеет ли фокус окно «Блокнот».

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