使正在运行的进程成为活动窗口

时间:2012-02-16 11:07:29

标签: c# ms-access

好的,我有三个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,现在我想让这个进程成为我的活动窗口。我该怎么做?

由于

2 个答案:

答案 0 :(得分:9)

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);

答案 1 :(得分:2)

试试这个:

[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));
    }

}