Как создать приложение Win32 без окна в фоновом режиме с C? - PullRequest
2 голосов
/ 05 января 2011

Приложению не нужно ни окна, ни консоли. Это может быть консольное приложение, если окно консоли можно удалить или перевести в фоновый режим. Приложение выполнит несколько простых задач (таких как очистка мусорных файлов) и завершит работу.

  1. Я надеюсь, что приложение не должно быть службой Windows, если это возможно.

  2. Я надеюсь, что приложение можно запустить двойным щелчком мыши в окне проводника и запустить без вывода сообщений.

  3. Когда приложение работает, я надеюсь, что курсор мыши не должен быть изменен на форму песочных часов. То есть не беспокоить пользователя при запуске приложения. Просто беги и молча выходи.

  4. НЕ НУЖНО запускать его при запуске Windows или при входе пользователя в систему.

Я надеюсь, что это можно сделать в Си, если это возможно. Что мне делать?

Спасибо!

обновление: Сейчас нормально. Спасибо!


    task_finished = 0;
    CreateThread(NULL, 65535, task_thread, para, 0, NULL);

    MSG msg;
    while(!task_finished){
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if(task_finished)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

Ответы [ 2 ]

2 голосов
/ 05 января 2011

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

1 голос
/ 05 января 2011

Все, что вам нужно, это цикл сообщений - просто используйте этот код (измененный с здесь ):

MSG msg;
BOOL bRet; 
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

Редактировать:

Для I/ O или другие задачи, вы можете (1) создать другой поток и делать все оттуда, или (2) использовать MsgWaitForMultipleObjects внутри цикла (перед следующим вызовом GetMessage ()), чтобы одновременнодождитесь ввода-вывода и сообщений, чтобы вы могли получать уведомления, когда есть либо сообщение, либо когда ваш ввод-вывод завершен.

Предупреждение :

Я не понял, как заставить приложение не отображать форму песочных часов при запуске.Если вам нужна эта функциональность, рассмотрите возможность создания службы Windows.Вы также можете скомпилировать как консольное приложение, а затем использовать FreeConsole, чтобы скрыть окно.

...