Сделайте запущенный процесс активным окном - PullRequest
4 голосов
/ 16 февраля 2012

Хорошо, у меня есть три базы данных Microsoft Access. Я хочу иметь возможность переключаться между ними программно. У меня есть метод void, который принимает строковый параметр с именем dbName (имя моей базы данных).

public void SwitchDatabase(string dbName)
{

}

Я знаю, что такое MainWindowTitle моей базы данных Access, и у каждой базы данных есть свой 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;
}

Как только я найду это, я смогу получить идентификатор процесса, и теперь я хочу сделать этот процесс моим активным окном. Как мне это сделать?

Спасибо

Ответы [ 2 ]

9 голосов
/ 26 июня 2013

Ответ Эрика не сработал для меня.Я нашел лучшее решение здесь на SO с SetForegroundWindow.Сначала я задавался вопросом, почему это один раз сработало, а в следующий раз - нет. Затем я исключил текущий процесс из списка.Итак, вот мой окончательный вариант:

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);
3 голосов
/ 16 февраля 2012

Попробуйте это:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...