2017-09-10 1 views
0

J'ai une application simple avec 1 bouton pour savoir si Notepadd ++ est déjà ouvert. J'ai passé en revue quelques sujets mais je ne peux pas trouver le bon. Dans la méthode de bouton je:Application simple pour savoir si Notepad ++ est en cours d'exécution

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]..); 
} 
}; 

J'ai un problème avec "\ Local $ notepad ++ $", je reçois cette erreur:

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

et cette autre:

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

S'il y a un autre moyen plus facile de le faire, aidez-moi s'il vous plaît! J'ai aussi essayé de changer le nom pour: notepad ++. J'utilise visual studio 2015 C++

Je revue et utilise comme référence:

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

Est-ce que le bloc-notes déjà utiliser un mutex vous pouvez utiliser ?? – user0042

+1

Vous pourriez le compiler en écrivant 'L 'Local \\ $ notepad ++ $" '; notez le préfixe 'L'. Je ne suis pas sûr que cela fonctionnerait vraiment - qu'est-ce qui vous fait croire Notepad ++ crée un mutex avec ce nom? –

+0

Pour clarifier ce que suggère @IgorTandetnik, 'LPCWSTR' est un pointeur vers une chaîne de caractères de 16 bits. 'const char *' est pour les caractères de 8 bits. Ajouter 'L' avant une constante de chaîne indiquera au compilateur de traiter les caractères de cette chaîne comme 16 bits, ce qui peut être converti en' LPCWSTR'. – bindsniper001

Répondre

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! 
} 

pour la méthode, mettre un * avant les citations

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

J'ai une meilleure solution:

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); 
} 

Et puis:

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

Merci @bukkojot. J'ai été capable de trouver: https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms686701(v=vs.85).aspx –