C ++ запускающая программа без открытия консоли

Я работал над приложением, чтобы установить фон рабочего стола другого приложения, которое я нашел здесь: http://www.optimumx.com/downloads.html#SetWallpaper. Идея состоит в том, чтобы устанавливать фон для обоев каждые 10 минут, поэтому он запускает SetWallpaper.exe с помощью команды ‘SetWallpaper.exe / D: S Wallpaper.jpg’, но когда я запускаю свое приложение, оно создает консольное окно, которое не ‘ t автоматически закрывается, и когда я закрываю его вручную, он убивает exe.

#include <windows.h>
int main() {
int i = 1;
int j = 3;
// refresh = time until refresh in minutes
int refresh = 10;
// 1000 milliseconds = 1 second
int second = 1000;
int minute = 60;
int time = second * minute * refresh;
while (i < j) {
system("cmd /c start /b SetWallpaper.exe /D:S Wallpaper.jpg");
Sleep(time);
}
return 0;
}

Я попытался использовать «sleep.exe», который поставляется вместе с MinGW Msys, но он создает новый процесс для каждой команды, в конечном итоге перебивая все процессы.

Заранее спасибо!

4

Решение

Первая проблема, с которой вы столкнулись, заключается в том, что вы создали свою программу как консольное приложение с main метод. Вместо этого создайте его как Win32 Project с WinMain точка входа. Это будет вызвано напрямую, без создания окна консоли.

РЕДАКТИРОВАТЬ: Вторая проблема решена ответом Ферруччо, который заключается в том, что вы вызываете другое консольное приложение из своего, что также приведет к созданию окна консоли.

8

Другие решения

Вы идете по этому пути трудным путем. Изменить обои Windows в программе довольно просто:

#include <windows.h>

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) "path/to/wallpaper.jpg", SPIF_UPDATEINIFILE);

В любом случае, если вы настаиваете на запуске внешней программы для этого. использование CreateProcess. Он имеет возможность запускать приложения в режиме консоли без видимого окна, устанавливая dwCreationFlags параметр для CREATE_NO_WINDOW,

6

Задавать ShowWindow в false и не забудьте FreeConsole в конце.

#include <windows.h>int main(void)
{

ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false);

// put your code here

system("cmd /c start /b SetWallpaper.exe /D:S Wallpaper.jpg");

FreeConsole();

return 0;
}

И как упоминал Ферруччо, Вы можете использовать SetTimer а также SystemParametersInfo периодически инициировать изменение.

#define STRICT 1
#include <windows.h>
#include <iostream.h>

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{

LPWSTR wallpaper_file = L"C:\\Wallpapers\\wallpaper.png";
int return_value = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, wallpaper_file, SPIF_UPDATEINIFILE);cout << "Programmatically change the desktop wallpaper periodically: " << dwTime << '\n';
cout.flush();
}

int main(int argc, char *argv[], char *envp[])
{
int Counter=0;
MSG Msg;

UINT TimerId = SetTimer(NULL, 0, 2000, &TimerProc); //2000 milliseconds = change every 2 seconds

cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
return 16;

while (GetMessage(&Msg, NULL, 0, 0))
{
++Counter;
if (Msg.message == WM_TIMER)
cout << "Counter: " << Counter << "; timer message\n";
else
cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
DispatchMessage(&Msg);
}

KillTimer(NULL, TimerId);
return 0;
}
2
По вопросам рекламы [email protected]