5

私はここで見つけた別のアプリケーションのデスクトップの背景ベースを設定するアプリケーションに取り組んでいます:http ://www.optimumx.com/downloads.html#SetWallpaper 。アイデアは、背景を10分ごとに壁紙に設定することです。そのため、コマンド「SetWallpaper.exe / D:S Wallpaper.jpg」を使用してSetWallpaper.exeを起動しますが、アプリケーションを起動すると、コンソールウィンドウが作成されます。 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;
}

MinGW Msysに付属している「sleep.exe」を使用してみましたが、各チームに新しいプロセスが作成され、最終的にすべてのプロセスが占有されます。

前もって感謝します!

4

3 に答える 3

8

最初の問題は、プログラムをメソッドを持つコンソール アプリケーションとして作成したことですmain。代わりに、エントリ ポイントWin32 Projectを持つとして作成します。WinMainこれは、コンソール ウィンドウを作成せずに直接呼び出されます。

編集: 2番目の問題は、コンソールウィンドウが作成される結果となる別のコンソールアプリケーションを呼び出すという点で、Ferruccioの回答によって対処されます。

于 2012-10-05T13:19:53.097 に答える
6

あなたはそれについて難しい方法をとっています。プログラムで Windows の壁紙を変更するのは非常に簡単です。

#include <windows.h>

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

いずれにせよ、それを行うために外部プログラムを起動することを主張する場合. CreateProcessを使用します。dwCreationFlagsパラメータを に設定することで、ウィンドウを表示せずにコンソール モードのアプリを起動できますCREATE_NO_WINDOW

于 2012-10-05T14:48:18.880 に答える
2

に設定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;
}

Ferruccio が述べたように、 and を使用SetTimerSystemParametersInfoて定期的に変更をトリガーできます。

#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;
}
于 2012-10-05T18:05:25.983 に答える