【问题标题】:Make a running process the active Window使正在运行的进程成为活动窗口
【发布时间】:2012-03-07 18:53:17
【问题描述】:

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

谢谢

【问题讨论】:

  • 如果创建 .laccdb 是因为有人使用 Access 而不是您的应用程序打开了数据库,该怎么办?或者如果文件存在是因为打开它的应用程序在清理它之前崩溃了?我不认为这是一种可靠的工作方式。
  • 好的,问题的关键是切换到我认为是打开的数据库,所以如果不是,它会抛出一个我可以处理的异常
  • 结合下面 Eric 回答中的信息,以下链接帮助我完成了这项工作 - stackoverflow.com/questions/4566632/…

标签: c# ms-access


【解决方案1】:

埃里克的回答对我不起作用。我使用 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 如果您已经运行了程序的第二个实例,您将获得 2 个或多个进程名称相同但 ID 不同,那么您在 LINQ 中采用非当前进程。也许我迟到了一点,我只是说'
【解决方案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));
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2015-05-27
    相关资源
    最近更新 更多