AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Fremdes Programm beenden - Handle anhand Filename ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Fremdes Programm beenden - Handle anhand Filename ermitteln

Ein Thema von Ines · begonnen am 14. Okt 2010 · letzter Beitrag vom 6. Feb 2011
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 14. Okt 2010, 14:35
Zitat von Pappa ante portas:
Mein Name ist Lose - ich kaufe hier ein.
Aber nun genug OT
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ines

Registriert seit: 22. Aug 2006
Ort: Augsburg
96 Beiträge
 
Delphi 2009 Enterprise
 
#2

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 14. Okt 2010, 15:41
Hallo und Danke für Eure Hilfe!

Den Thread habe ich gelesen - habe aber Probleme, das richtige Handle zu ermitteln. Der Rückgabewert von ShellExecuteEx scheint nicht das Fensterhandle zu sein (oder ich bin zu dumm!).

Mein Problem habe ich jetzt folgendermaßen gelöst:
Ich habe in GetWindows eine Abfrage eingebaut, die nach dem nicht zu löschenden Dateinamen sucht. Wenn vorhanden, dann habe ich ja das Handle und kann das Fenster mit Sendmessage (hwnd, WM_Close, SC_Close) beenden.

Das dürfte dem Nutzer die größtmöglichste Freiheit geben - mal' schauen.

Viele liebe Grüße
Ines
Ines
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 14. Okt 2010, 15:45
Wie im verlinkten Thread bereits gesagt würde ich die Fenster durchgehen und die Prozesshandles vergleichen: http://www.delphipraxis.net/999827-post2.html
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 14. Okt 2010, 16:41
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  ShExecInfo.lpVerb := nil;
  ShExecInfo.lpFile := PChar('NotePad.exe');
  ShExecInfo.lpDirectory := nil;
  ShExecInfo.nShow := SW_Show;
  if not ShellExecuteEx(@ShExecInfo) then Showmessage(IntToStr(GetLastError));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TerminateProcess(ShExecInfo.hProcess,0);
  CloseHandle(ShExecInfo.hProcess);

  ODER: su.
  SendMessage(FindMainWindow(7964),WM_Close,0,0);

end;

Delphi-Quellcode:
type
  PEnumInfo = ^TEnumInfo;
  TEnumInfo = record ProcessID: DWORD; HWND: THandle; end;

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
    var
      PID: DWORD;
    begin
      GetWindowThreadProcessID(Wnd, @PID);
      Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND));
      if not Result then EI.HWND := WND;
    end;

  function FindMainWindow(PID: DWORD): DWORD;
    var
      EI: TEnumInfo;
    begin
      EI.ProcessID := PID;
      EI.HWND := 0;
      EnumWindows(@EnumWindowsProc, Integer(@EI));
      Result := EI.HWND;
    end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Ines

Registriert seit: 22. Aug 2006
Ort: Augsburg
96 Beiträge
 
Delphi 2009 Enterprise
 
#5

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 15. Okt 2010, 08:01
Guten Morgen!

Nochmals zu meinem Problem - das ich hoffentlich jetzt gelöst habe.

Der Arzt kann sich via FTP alle Files eines Patienten lokal auf seinen PC laden. Er hat dann die Möglichkeit, sich diese Files mit ShellExecuteEx anzeigen zu lassen - kann aber auch über z.B. Explorer und Doppelklick solch ein File öffnen.

Werden jetzt Files vom nächsten Patienten geladen - dann muß das lokale Verzeichnis zuerst geleert werden. Wird z.B. noch ein pdf-File vom vorherigen Patienten angezeigt, dann scheitern alle Löschbemühungen.

Da ich nicht weiß, ob mein Programm die Fenster mit ShellExecuteEx geöffnet hat oder der Arzt via Explorer usw. dies getan hat funktioniert die Abfrage in GetWindows nach der nicht zu löschenden Datei am besten. Außerdem will ich z.B. Adobe auch nicht komplett abschießen, da der Arzt eventuell eine Publikation über ein bestimmtes Krankheitsbild geöffnet hat und die Files mit diesen Ergebnissen vergleichen will.

Ich danke Euch allen für Eure Mühe und auch für die Codebeispiele, die mir sehr geholfen haben.

Viele Grüße aus Augsburg
Ines
Ines
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 15. Okt 2010, 08:29
Manchmal kann es auch wirklich sinnvoll sein, dem User nicht seinen Brei direkt in den Mund zu schaufeln sondern ihn auch mal kauen zu lassen. Mit anderen Worten: Wenn der User zum nächsten Patienten will und noch Dateien offen sind, soll der User die offenen Fenster gefälligst selber zumachen, also entsprechende Meldung raus und weiter gehts. Klar ist der Computer nicht die Kernkompetenz des Arztes, aber wenn das Programm erst gar keine Intelligenz beim User voraussetzen kann, wozu isses dann für Ärzte? Hoffentlich ist der Bediener nicht Chirurg und vergisst auch öfter mal was im Patienten...
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 15. Okt 2010, 08:54
Das hängt vom eigenen Anspruch und der eigenen Sichtweise ab.

Wenn es möglich wäre und in sich logisch schlüssig (und die Usability erhöht) warum nicht realisieren.

So Dialoge wie "Um Fortzufahren müssen Sie zwingend xyz.pdf schließen"
Ja ich will fortfahren (diese Absicht habe ich kundgetan) und der Rechner weiß wie man den Zustand herstellt, dass ich fortfahren kann, dann soll der das gefälligst auch machen.

Es ist eine Gratwanderung zwischen Unterstützung und Bevormundung.

Wichtigstes Kriterium ist aber als Kernfrage "Wie schaffe ich es, dass der Anwender in seinem Arbeitsfluss nicht gestört wird?"
Es geht niemals um ein paar Klicks, sondern dass der Anwender in dem Moment eine andere Aufmerksamkeit hat wo diese (vermeidbaren) Klicks selbigen aus dieser Aufmerksamkeit reißen und eine völlig andere aufzwingen.

Will ich mit meiner Software den User unterstützen oder (aus reiner Bequemlichkeit, Faulheit, Unwissenheit, Ignoranz) behindern. Da muss jetzt jeder selber entscheiden wo er da stehen möchte.

Ich habe meinen Anspruch definiert (manche halten mich für pingelig ) und prüfe bei jeder Programmierung (die zum User rausgeht) ob ich meinem Anspruch noch gerecht werde.
Ergänzend sollte ich noch sagen, dass ich in der glücklichen Lage bin den Zeitrahmen für ein Projekt mitgestalten zu dürfen und die Mitwirkenden (am Zeitrahmen) lieber ein gutes als ein schnelles Release haben möchten.

Denn der Anspruch bleibt auf der Strecke wenn die Zeit zu knapp ist.

PS War das jetzt schon das Wort zum Sonntag?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (15. Okt 2010 um 09:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln

  Alt 6. Feb 2011, 13:21
Werden jetzt Files vom nächsten Patienten geladen - dann muß das lokale Verzeichnis zuerst geleert werden.
Warum diese technisch unnötige Einschränkung?
Vielleicht möchte der Dottore die Dokumente zweier Krebspatienten vergleichen; wer weiss...
siehe Sir Rufo's:
Zitat:
Wichtigstes Kriterium ist aber als Kernfrage "Wie schaffe ich es, dass der Anwender in seinem Arbeitsfluss nicht gestört wird?"
Da es im lokalen Verzeichnis zu Kollisionen von Dateinamen kommen könnte, braucht man doch nur für jeden Patienten ein Unterverzeichnis (evtl. Name=Patientennr) anzulegen.
Und zum Programmende werden alle temporären Verzeichnisse aus Datenschutzgründen wieder gelöscht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz