2017-02-11 9 views
0

私のコードを実行した後に私のコンピュータにある.exeプログラムを起動したいのですが、プログラムを開いた後もまだ何かをやっていますが、cで外部プログラムを実行するには

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
//#define _WIN32_WINNT 0x0500 
#include <windows.h> 

int main() { 
    POINT mouse; 
    //HWND hWnd = GetConsoleWindow(); 
    //ShowWindow(hWnd, SW_MINIMIZE); 
    //ShowWindow(hWnd, SW_HIDE); 
    // how to open program ? 
    system("start C:\Riot Games\League of Legends\LeagueClient.exe"); 

    while (true) { 
     GetCursorPos(&mouse); 
     int x = mouse.x; 
     int y = mouse.y; 
     SetCursorPos(x + rand() % 40 - 20, y + rand() % 40 - 20); 
     printf("x = %d ", mouse.x); 
     printf("y = %d\n", mouse.y); 
     Sleep(1); 
    } 
} 

システム機能は2つの理由から機能しません。アプリが終了するまでコードを一時停止し、コードを実行しようとするとC:Riotが見つからないと表示されます。

+0

'system()'関数は、実行されたコマンドが完了するのを待ちます。 LinuxやMacでは 'fork()'を実行するか、バックグラウンドで外部実行ファイルを開始するコマンドを実行します。しかし、Windowsは 'fork()'を持っていないので、そのようなバックグラウンドプロセスがあるかどうかはわかりません。 Windows APIから適切な関数が必要になります。 –

+0

オハイオ州参照してください、ありがとう。私はそれを見つけようとします。 –

答えて

0

いくつかの問題は文字列"start C:\Riot Games\League of Legends\LeagueClient.exe"です。

まず、\文字がエスケープ文字に使用されます。これは、文字列に直接挿入された場合は別の意味の文字を入力することを意味します。たとえば、"を文字列に書き込むには、\"を使用する必要があります。"はそれが文字列の最後であることを意味します。同様に、\nは、改行をストリングに直接書き込むことができないため、改行を意味します。ここで\RC:\Riot Gamesの場合は、何も意味しない文字Rをエスケープしていることを意味します。コンパイラはR\Lの場合も同様)として\Rを解釈し、したがって文字列"start C:\Riot Games\League of Legends\LeagueClient.exe""start C:Riot GamesLeague of LegendsLeagueClient.exe"に変換します。 \文字をエスケープするには、\\を使用します。これまでのところ、文字列はsystem("start C:\\Riot Games\\League of Legends\\LeagueClient.exe")である必要があります。

また、文字列には別の問題があります。コマンドラインのスペースは、通常、スペースの後に指定されたパラメータでスペースの前のパスでプログラムを実行することを意味します。これは、通常、プログラムでファイルを開くために使用されます。簡単にするには、"start C:\\Riot Games\\League of Legends\\LeagueClient.exe"は、プログラムC:\Riotを実行し、ファイルGames\League of Legends\LeagueClient.exeを開くことを意味します。以前に述べたように、コンパイラはコード内のC:\RiotC:Riotに変更していますので、プログラムC:Riotを実行しようとしていますが、見つからないことがあります。とにかく、スペースが実際にファイル名の一部であることをコンピュータに伝えるには、ファイル名の前後に引用符を付ける必要があります。"前述のように、文字列に引用符を使用するには、\"を使用します。正しい方法はsystem("start \"C:\\Riot Games\\League of Legends\\LeagueClient.exe\"")です。また、startはコンソールを開きますので、プログラム自体を開く場合は、単にsystem("\"C:\\Riot Games\\League of Legends\\LeagueClient.exe\"")を使用してください。

あなたのコードを持つもう一つの問題は、あなたがwhile(1)を使用するか、または#define true 1を使用してマクロとしてtrueを定義する必要がありますどちらかだからtrueはCで定義されていないということです。

だから、正しいコードは次のようになります。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
//#define _WIN32_WINNT 0x0500 
#include <windows.h> 

#ifndef true //test if true is defined in case it's already defined somewhere else 
#define true 1 
#endif 

int main() { 
    POINT mouse; 
    //HWND hWnd = GetConsoleWindow(); 
    //ShowWindow(hWnd, SW_MINIMIZE); 
    //ShowWindow(hWnd, SW_HIDE); 
    // how to open program ? 
    system("\"C:\\Riot Games\\League of Legends\\LeagueClient.exe\""); 

    while (true) { 
     GetCursorPos(&mouse); 
     int x = mouse.x; 
     int y = mouse.y; 
     SetCursorPos(x + rand() % 40 - 20, y + rand() % 40 - 20); 
     printf("x = %d ", mouse.x); 
     printf("y = %d\n", mouse.y); 
     Sleep(1); 
    } 
} 
+0

ありがとうございました!しかし、テスト用のシステム(ノートパッド)を試してみると、メモ帳を開いてノートパッドを閉じるまで、プログラムを停止しましたが、LeagueClientと一緒にプログラムを停止しました。何らかの理由でexeプログラムが何らかの理由で停止しなかったのでしょうか?ちょっと興味があるんだけど。 –

0

利用システムは、()確保し、プロセスを作成するための良い方法は、CreateProcessを()関数ではありません。他のもの - system()は、起動したプログラムが停止するまで待機し、並列ではない後にコードを実行します。

関連する問題