使运行进程成为活动窗口
好吧,我有三个Microsoft Access数据库。我希望能够以编程方式切换这些内容。我有一个void方法,它接受一个名为dbName(我的数据库名称)的字符串参数。使运行进程成为活动窗口
public void SwitchDatabase(string dbName)
{
}
我知道我的Access数据库的MainWindowTitle是什么,每个数据库都有一个不同的MainWindowTitle这样我就可以创建Process类的数组,使这个相等,从而System.Diagnostics.Process.GetProcesses()。然后我可以通过我的正在运行的进程循环,直到我找到了一个在ProcessName是MSACCESS和MainWindowTitle是正确的,像这样:
Process[] processList = Process.GetProcesses();
foreach (Process theProcess in processList)
{
string processName = theProcess.ProcessName;
string mainWindowTitle = theProcess.MainWindowTitle;
}
有一次,我发现这一点,我可以再抢进程ID,现在我想使这个过程成为我的活动窗口。我该怎么做呢?
感谢
试试这个:
[DllImport("user32.dll", CharSet=CharSet.Auto,ExactSpelling=true)]
public static extern IntPtr SetFocus(HandleRef hWnd);
[TestMethod]
public void PlayAround()
{
Process[] processList = Process.GetProcesses();
foreach (Process theProcess in processList)
{
string processName = theProcess.ProcessName;
string mainWindowTitle = theProcess.MainWindowTitle;
SetFocus(new HandleRef(null, theProcess.MainWindowHandle));
}
}
Eric的回答并没有为我工作。我用SetForegroundWindow发现了一个更好的解决方案here on SO。 首先我想知道,为什么有一次这样做,下次它没有。然后我从列表中排除当前进程。所以,这是我的最终版本:
static void BringWindowToFront()
{
var currentProcess = Process.GetCurrentProcess();
var processes = Process.GetProcessesByName(currentProcess.ProcessName);
var process = processes.FirstOrDefault(p => p.Id!=currentProcess.Id);
if (process == null) return;
SetForegroundWindow(process.MainWindowHandle);
}
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
我想不通为什么'var process = processes.FirstOrDefault(p => p.Id!= currentProcess.Id);'正在检查不平等。根据我的理解,这应该是平等检查。请改正。 – skjoshi 2016-04-23 15:20:53
如果.laccdb创建是因为某人用Access打开数据库而不是您的应用程序?或者,如果文件存在是因为打开它的应用程序在清除之前崩溃了?我不认为这是一种可靠的工作方式。 – 2012-02-16 11:11:36
好吧,问题的关键是切换到我认为是开放的数据库,所以如果不是,它会抛出一个我可以处理的异常 – JMK 2012-02-16 11:15:13
结合Eric在下面的答案中的信息,以下链接帮助我获得这工作 - http://stackoverflow.com/questions/4566632/maximize-another-process-window-in-net – JMK 2012-02-16 15:07:44