我想这样做...如果记事本在前台它打开计算器...如果另一个程序打开什么都没做...记事本是oepn manualy ...“开始,记事本”......我有这个代码“看”如果记事本是开放的...不知道如何继续D:我知道我必须使用
if (switch == 0)
{
if (SOMETHING == "Notepad")
{
var switch = 1 //so it doesnt enters in a loop
OPEN CALCULATOR //irrelevant, i may use another part of otrher code that is already working
}
}
“switch”变量从代码的开头变为0,这样就可以了(希望)
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
Process GetActiveProcess()
{
IntPtr hwnd = GetForegroundWindow();
uint pid;
GetWindowThreadProcessId(hwnd, out pid);
Process p = Process.GetProcessById((int)pid);
return p;
}
问题是我不知道在“SOMETHING”上使用其余的代码,以及在何处或如何使用If ...
答案 0 :(得分:1)
你可以这样做:
Process[] notePadProcesses = Process.GetProcessesByName("notepad.exe");
IntPtr activeWindowHandle = GetForegroundWindow();
if (notePadProcesses != null && notePadProcesses.Length > 0
&& notePadProcesses.Any(p=>p.MainWindowHandle == activeWindowHandle))
{
// notepad is open in the foreground.
switch = 1;
// OPEN Calculator or whatever you need to.
}
else
{
// notepad is either not open, or not open in the foreground.
}
基本上我们使用C#友好的Process类来查找所有打开的记事本进程。 然后找出它是否是一个活跃的进程并从那里开始。
请小心使用activewindow逻辑,因为很多时候,它们会导致竞争条件,当您确定某个进程处于活动状态并尝试执行某些操作时,它可能不再是一个活动进程。谨慎行事。