Avatar billede susrn Nybegynder
11. marts 2004 - 15:40 Der er 20 kommentarer og
1 løsning

windows, spørge om program kører

Hvordan kan man i windows få at vide om et program er igang?
Avatar billede arne_v Ekspert
11. marts 2004 - 15:42 #1
En måde er ihvertfald at loope igennem alle processer og checke om
det matcher.

Men jeg mener også at man kan slå mere direkte op.
Avatar billede jpk Nybegynder
11. marts 2004 - 15:45 #2
Hvis det er et program med et vindue, kan du bruge FindWindow til at se om det kører..?
Avatar billede driis Nybegynder
11. marts 2004 - 15:58 #3
Som arne_v antyder er der mange måder at gøre det på. Du kan enumerere alle processer eller alle vinduer og se om du kan finde det relevante vindue. Hvilken måde du vælger, kommer an på, hvad du ved om vinduet. Kender du filnavnet, vinduets titel eller dets Class name ?

Her er et eksempel, der kontrollerer om Notepad kører (Enumeration gennem alle vinduer og kontrol om ét passer med class name "Notepad"):

#include <windows.h>
#include <iostream>

using namespace std;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char buf [MAX_PATH]={0};

    GetClassName(hwnd,buf,MAX_PATH);
    if ( strcmp(buf,"Notepad") == 0 )
    {
        cout << "Notepad er startet!\n";
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}


int main()
{
    BOOL w = EnumWindows(EnumWindowsProc,0);
   
    if ( w == TRUE )
        cout << "Enumeration slut, Notepad blev ikke fundet.\n";
}
Avatar billede susrn Nybegynder
11. marts 2004 - 18:25 #4
Tak
Avatar billede susrn Nybegynder
12. marts 2004 - 08:30 #5
hvorfor får jeg fejl når jeg forsøger at afvikle koden?

E2034 Cannot convert 'bool (__stdcall *)(void *,long)' to 'int (__stdcall *)()'
Avatar billede jpk Nybegynder
12. marts 2004 - 08:34 #6
Hvis du bare skal se om en instans af Notepad kører, kan du gøre sådan:

if(FindWindow("Notepad", NULL))
  cout << "Notepad er startet!\n";
else
  cout << "Notepad er ikke startet!\n";
Avatar billede susrn Nybegynder
12. marts 2004 - 08:38 #7
fejlen kommer når jeg vil kompilere, (ikke rigtig vågen endnu)
Avatar billede susrn Nybegynder
12. marts 2004 - 08:47 #8
Det er ikke notepad, men mit eget program jeg skal se om kører, kan FindWindow bruges på hvad som helst?
Avatar billede jpk Nybegynder
12. marts 2004 - 08:49 #9
Det er en forudsætning, at programmet har et vindue.
Du kan skifte "Notepad" ud med navnet på dit programs main wnd klasse.
Avatar billede susrn Nybegynder
12. marts 2004 - 08:53 #10
Jeg fandt ud af at det virker efter hensigten hvis jeg kalder FindWindow(Null, "programNavn").
VIl du have points?
Avatar billede jpk Nybegynder
12. marts 2004 - 08:57 #11
Nej, det er okay...

Du skal dog være opmærksom på, at det er IKKE programmets navn der tjekkes på i dit eksempel, det er den tekst der står i vinduet!

Hvis du fx ændrer teksten alt efter hvilket dokument du viser, vil det ikke virke!
Avatar billede susrn Nybegynder
12. marts 2004 - 09:13 #12
hvilken er main wnd klasse?
Avatar billede jpk Nybegynder
12. marts 2004 - 09:17 #13
Det er det navn du har registreret via din WNDCLASS struktur, altså lpszClassName memberen.
Avatar billede susrn Nybegynder
12. marts 2004 - 09:27 #14
hmm, jeg arbejder i c++ builder som ordner den slags bag min ryg..
Avatar billede jpk Nybegynder
12. marts 2004 - 09:38 #15
Tja, der kan jeg ikke umiddelbart hjælpe dig...

Siden det nu er dit eget program du vil se om kører, kan du jo bruge en mutex som du låser ved opstart og frigiver ved luk...
I så fald er det kun den første instans der kan låse mutex'en og alle andre instanser kan fortolke det som at der allerede kører et program.
Avatar billede susrn Nybegynder
12. marts 2004 - 10:57 #17
Der er tale om to forskellige programmer, det ene program skal kun starte hvis det andet allerede er kørende.
Avatar billede jpk Nybegynder
12. marts 2004 - 11:07 #18
Okay, du kan stadig bruge samme teknik:

I programmet der kun skal starte hvis det andet allerede kører gør du :
1) lock mutex
2) Hvis fejl, det andet program har låst den, altså kører det
3) Ellers - det andet program kører ikke, unlock mutex og exit
Avatar billede jpk Nybegynder
12. marts 2004 - 11:07 #19
Men det er måske ikke 2 programmer du selv laver..?
Avatar billede susrn Nybegynder
12. marts 2004 - 11:17 #20
mja.. det er an anden der laver det program jeg skal spørge på
Avatar billede jpk Nybegynder
12. marts 2004 - 11:19 #21
Et synkroniseringsobjekt som en mutex er den eneste sikre måde at tjekke om et andet program kører eller ej...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester