Вы можете сделать это просто с помощью вызовов 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;
Тоже не проверял, но у меня сегодня все хорошо, так зачем?