2017-09-10 21 views
0

Notepadd ++が既に開いているかどうかを知るためのボタンが1つ付いた簡単なアプリケーションがあります。私はいくつかのトピックを見直しましたが、私は正しいトピックを見つけることができません。私が持っているボタンのメソッド内:メモ帳++が実行されているかどうかを確認する簡単なアプリケーション

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 
    mutex = CreateMutex(NULL, TRUE, "Local\\$notepad++$"); 
    if (GetLastError() == ERROR_ALREADY_EXISTS) { 
     //MessageBox::Show(..[not open]..); 
    } 
    //MessageBox::Show(..[open]..); 
} 
}; 

私は、 "ローカルの\ $メモ帳++ $" との問題を抱えている、私はこのエラーを取得:

argument of type "const char *" is incompatible with parameter of type "LPCWSTR" 

この他:

'HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR)': cannot convert argument 3 from 'const char [18]' to 'LPCWSTR' 

これを行うもっと簡単な方法がある場合は、私を助けてください!私はまた、名前をnotepad ++に変更しようとしました。私は、Visual Studioを使用しています2015 C++

私がレビューを持っており、リファレンスとして使用します。

C/C++ How to tell if a program is already running?

Is using a Mutex to prevent multiple instances of the same program from running safe?あなたの方法について

+0

メモ帳は、すでにあなたが使用することができますミューテックスを使用しています? – user0042

+1

'L 'を書くことでコンパイルできます。Local \\ $ notepad ++ $" ';プレフィックス 'L 'に注意してください。あなたはNotepad ++がこの名前のミューテックスを作成すると信じさせてくれるのでしょうか? –

+0

@IgorTandetnikが示唆していることを明確にするために、 'LPCWSTR'は16ビット文字列へのポインタです。 'const char *'は8ビット文字用です。文字列定数の前に 'L'を追加すると、コンパイラはその文字列の文字を16ビットとして扱い、' LPCWSTR'にキャストすることができます。 – bindsniper001

答えて

0
#include "Windows.h" 
/*...*/ 
LPCSTR app_name = "Notepad++: a free (GNU) source code editor"; 
if (FindWindowA(0, app_name)) { 
    // it's open! 
} else { 
    // it's not open! 
} 

は、引用符の前に*を入れ

CreateMutex(NULL, TRUE, *"Local\\$notepad++$"); 
0

私はより良い解決策を持っています:

int processExists(char *victim){ 
    int res=0,ret; 
    PROCESSENTRY32 proc; 
    proc.dwSize=sizeof(proc); 
    HANDLE snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if(!snap){abort();} 
    for(ret=Process32First(snap,&proc);ret;ret=Process32Next(snap,&proc)){ 
    if(strstr(proc.szExeFile,victim)){res=1;break;} 
    } 
    CloseHandle(snap); 
    return(res); 
} 

そして:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 
    mutex = CreateMutex(NULL, TRUE, "Local\\$notepad++$"); 
    if (!processExists("notepad++.exe") { 
     //MessageBox::Show(..[not open]..); 
    } 
    //MessageBox::Show(..[open]..); 
} 
}; 
+0

ありがとう@bukkojot。私は見つけることができた:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx –

関連する問題