Переключение фокуса между окнами Cmd, принудительная фокусировка (удерживайте 1 мгновение работы программы) - PullRequest
0 голосов
/ 03 августа 2009

Я создаю простую программу windows cmd и пытаюсь убедиться, что она запускается только один раз (если дважды щелкнуть exe-файл, отобразится только один экземпляр). так что в моем коде .. я добавил именованный мьютекс (имя - GUID) .. если запустить второй экземпляр программы, он покажет сообщение о том, что у вас уже запущен экземпляр ..

я хочу обновить код. поэтому вместо того, чтобы показывать вам сообщение, оно автоматически найдет уже запущенный процесс (окно), переключит на него фокус, а затем закроет себя.

сейчас я пытаюсь использовать

 FindWindow(NULL,window_name);
 SetForegroundWindow(window);

однако, когда я передаю имя окна (из диспетчера задач), оно не находит его !!! Ошибка говорит: не используется: S что странно, я даже попытался использовать имя диспетчера задач вместо этого ... и он все еще не мог найти его!

так может ли кто-нибудь мне указать, где я ошибся? :) также, если вы можете придумать какие-либо другие способы выполнения такой задачи, пожалуйста, скажите мне ...

примечание: какой-то друг на работе сказал мне использовать enumwindows, это хороший выбор (я сейчас читаю об этом) ... спасибо!

Ответы [ 3 ]

1 голос
/ 03 августа 2009

EnumWindows полезно, когда вы не знаете точное имя окна (частичное совпадение).

Я не уверен, что вы подразумеваете под «именем из диспетчера задач», но второй параметр функции FindWindow должен совпадать с заголовком вашего окна.

Пример использования EnumWindows:

BOOL CALLBACK WorkerProc(HWND hwnd, LPARAM lParam) {
    static TCHAR buffer[50];

    GetWindowText(hwnd, buffer, 50);
    if(_tcsstr(buffer, "window name goes here")) {
        // do something with hwnd here
        return FALSE;
    }

    return TRUE;
}

А затем назовите это так:

EnumWindows(WorkerProc, NULL);
1 голос
/ 03 августа 2009

Что вам нужно, это приложение Singleton. Есть много примеров этого вокруг. Мой друг написал статью на другом сайте много лет назад. Возможно, есть лучший способ сделать это сейчас, но здесь - это его статья

1 голос
/ 03 августа 2009

Вот отличная статья http://delphi.about.com/od/windowsshellapi/l/aa100703c.htm на эту тему.

Управление количеством экземпляров приложения

от Zarko Gajic - Руководство по программированию на Delphi

В этой статье вы узнаете, как «запустить один раз» Delphi приложение, которое может проверить его предыдущий (работающий) экземпляр. Вместе процесс, несколько приемов реализация такой проверки будет обсуждены; а также как привезти ваше уже запущенное приложение для на переднем плане, если пользователь пытается запустить его "еще раз". К концу статья у вас будет копия, чтобы пойти код для управления поведением вашего несколько экземпляров приложения: с возможностью ограничить количество запущенные экземпляры.

Представленные решения запрограммированы на Delphi, но код довольно понятен и должен быть легко переведен на C ++.

...