Я работал над приложением, чтобы установить фон рабочего стола другого приложения, которое я нашел здесь: 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, но он создает новый процесс для каждой команды, в конечном итоге перебивая все процессы.
Заранее спасибо!
Первая проблема, с которой вы столкнулись, заключается в том, что вы создали свою программу как консольное приложение с main
метод. Вместо этого создайте его как Win32 Project
с WinMain
точка входа. Это будет вызвано напрямую, без создания окна консоли.
РЕДАКТИРОВАТЬ: Вторая проблема решена ответом Ферруччо, который заключается в том, что вы вызываете другое консольное приложение из своего, что также приведет к созданию окна консоли.
Вы идете по этому пути трудным путем. Изменить обои Windows в программе довольно просто:
#include <windows.h>
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) "path/to/wallpaper.jpg", SPIF_UPDATEINIFILE);
В любом случае, если вы настаиваете на запуске внешней программы для этого. использование CreateProcess. Он имеет возможность запускать приложения в режиме консоли без видимого окна, устанавливая dwCreationFlags
параметр для CREATE_NO_WINDOW
,
Задавать 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;
}