[Delphi] Programma gestart?

Pagina: 1
Acties:

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 15:08
Hoi Allen,

ik ben al een tijdje op zoek naar een simpele manier om te controleren of een programma gestart is. Ik heb al uitgevonden dat dit kan als je bij uses het windows component (sorry als ik het verkeerd zeg) thelp32 aanroept en dan met system call aan de gang gaat. Nu is mijn delphi kennis niet zo heel erg groot, maar ik krijg dat niet voor elkaar. Weet er iemand of er een component bestaat, waar je makkelijk in het geheugen kan zoeken op een gestart programma?

BVD

Verwijderd

Veel programma's kan je vinden met de api call FindWindow als je weet hoe het main window heet. Als het mainwindow bestaat draait het programma, als het mainwindow niet bestaat draait het programma ook niet.

  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
TIP 203
Hoe kan ik voorkomen dat mijn programma twee keer wordt gestart?



http://www.assu-assist.nl/pgg/203.shtml

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 15:08
Het is niet dat ik wil voorkomen dat mijn programma gestart is, maar ik wil kijken of een ander programma een keer geladen is, zodat ik met het programma kill (dos commando) deze kan stoppen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

Als je opzoek bent naar bepaalde componenten, functies, objecten etc, kijk dan eens op community.borland.com, torry.net of zelfs m.b.v. google.

Er is daar zoveel te vinden!.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
Meer zoiets? Moet je alleen wel de titel van je progje weten.
code:
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.btnKillClick(Sender: TObject);
var
  hw: HWND;
begin
  hw:=FindWindow('TApplication','Testprogramma');
  if hw<>0 then
    PostMessage(hw, WM_CLOSE, 0, 0);
  end;


end;

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Is het Class type altijd TApplication?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
Op maandag 04 maart 2002 19:37 schreef jelmervos het volgende:
Is het Class type altijd TApplication?
Ik hoop het :)
Zit niet zo in die direkte API calls

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Op maandag 04 maart 2002 19:37 schreef jelmervos het volgende:
Is het Class type altijd TApplication?
Class type = class type van je form.
voor je MainForm met caption MyMainForm en class type TMyMainForm doe je dus
code:
1
theHandle := FindWindow('TMyMainForm', 'MyMainForm');

edit:
precies andersom dus, die parameters |:(

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

Bij findwindow kan je ook maar 1 parameter invullen, en de andere op 0 zetten. Dan hoef je de klasse van je window niet te weten.. dan heb je genoeg aan de applicatie naam.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 15:08
Dus als ik bv, msn wil kunnen killen moet ik zeggen:
theHandle := FindWindow('msmsgs', '');

of moet ik dan precies het form name weten (en zo ja hoe vindt ik dit uit van een app die niet door mij geschreven is?)

  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
Op dinsdag 05 maart 2002 08:52 schreef ge-flopt het volgende:
Dus als ik bv, msn wil kunnen killen moet ik zeggen:
theHandle := FindWindow('msmsgs', '');
Volgens mij wordt het .. FindWindow(Nil, 'msmsgs');
of moet ik dan precies het form name weten (en zo ja hoe vindt ik dit uit van een app die niet door mij geschreven is?)
Aj, kweetniet, ik was zelf in de naieve veronderstelling dat het via de properties wel mogelijk zou zijn een titel te achterhalen, maar krijg dat nu ook niet voor elkaar.

Maar kom in de taskmanager wel de titel tegen :)

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Op dinsdag 05 maart 2002 08:52 schreef ge-flopt het volgende:
geblaat
hoe vindt ik de name van een app die niet door mij geschreven is?
Winsight?

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op dinsdag 05 maart 2002 09:53 schreef /dev/null het volgende:

[..]

Winsight?
Er is daar een nog beter alternatief voor dacht ik, zat deze niet in Visual Studio, anders was ie ergens te downen (share of freeware dus)... I dacht dat 't WinSpy heette

Cogito Ergo Credo


Verwijderd

Middels EnumWindows kun je ook nog uitzoeken welke Formulieren er actief zijn incl. naam.

Hieronder een stukje code om alle formulieren in een listbox (incl. handle in de object van de string) te pleuren.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function EnumWindowsProc(const hwnd: HWND; const lParam: LPARAM): WordBool; stdcall;
var
  lpString: PChar;
  iLength: Integer;
begin
  Result := lParam = 12345;
  if Result then
  begin
    lpString:=AllocMem(MAX_PATH);
    try
    iLength:=GetWindowText(hwnd, lpString, MAX_PATH);
    if iLength>0 then
      Form1.ListBox1.Items.AddObject(Copy(lpString, 1, iLength), TObject(hwnd));
    finally
    dispose(lpString);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
  EnumWindows(@EnumWindowsProc, 12345);
end;

Het zal je verbazen over het resultaat!

  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
Op dinsdag 05 maart 2002 10:25 schreef hvdberg het volgende:
Het zal je verbazen over het resultaat!
Smullen :P

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 15:08
HvdBerg, bedankt, was net wat ik nodig had, met wat aanpassingen kan ik nu uitvissen welke programma's draaien.

THX

Verwijderd

Op dinsdag 05 maart 2002 15:21 schreef ge-flopt het volgende:
HvdBerg, bedankt, was net wat ik nodig had, met wat aanpassingen kan ik nu uitvissen welke programma's draaien.

THX
Geen dank. KHeb nog ff de code ietwat optimaler gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function EnumWindowsProc(const hwnd: HWND; const lParam: LPARAM): WordBool; stdcall;
var
  lpString: PChar;
  iLength: Integer;
begin
  Result := lParam = 12345;
  if Result then
  begin
    iLength:=GetWindowTextLength(hwnd);
    lpString:=AllocMem(iLength);
    try
    iLength:=GetWindowText(hwnd, lpString, iLength);
    if iLength>0 then
      Form1.ListBox1.Items.AddObject(Copy(lpString, 1, iLength), TObject(hwnd));
    finally
    dispose(lpString);
    end;
  end;
end;

't Zal nog wel beter kunnen ma goed. 't Verschil zit 'm in GetWindowTextLength i.p.v. MAX_PATH. Hoewel MAX_PATH ook wel voldoende ruimte biedt leek GetWindowTextLength me beter aangezien dan niet steeds 260 bytes geïnitialiseerd hoeven te worden. Tevens als een caption (WindowText) langer is dan 260 karakters biedt deze oplossing meer soelaas. 't Zal wel trager zijn aangezien er een extra API-call wordt uitgevoerd. 260 bytes initialiseren is voor de CPU een fluitje van een cent.

I.i.g. suc6!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 15:08
Ik Probeer het eerst op de oude manier, mochten er toch onoverkoombare problemen geven dan probeer ik de nieuwe.

THX
Pagina: 1