![]() |
PostMessage systemweit senden?
Hallo,
ich sende mit PostMessage eine selbst registrierte Nachricht via HWND_BROADCAST. Anscheinend geht die Message aber nur an Fenster, die unter dem aktuellen Account laufen. Auf dem parallel eingeloggten Account kommt nichts an. Daher meine Frage: Kann ich die Messages auch über den eingeloggten Account hinaus versenden? OS: Windows XP SP1 Danke und Grüße StuffM |
Re: PostMessage systemweit senden?
Kurze Antwort: Nein
Wäre ja schlimm wenn man Fenster anderer User/Accounts manipulieren könnte. |
Re: PostMessage systemweit senden?
danke für den Hinweis,
hast du vielleicht ne andere Idee, wie ich verhindern kann, dass ein Programm mehrmals auf einem Rechner gestartet wird. Innerhalb eines Accounts klappt das mit PostMessage sehr gut, aber ich suche halt ne Variante, die auch außerhalb des Accounts wirkt. Semaphore und Mutex sind ja leider auch nur innerhalb des Accounts gültig. |
Re: PostMessage systemweit senden?
Also ganz spontan fällt mir ein, die Prozessliste beim Start zu durchsuchen. 2x drin = exit.
Oder wie Apache in eine Datei die PID des laufenden Prozesses schreiben. Oder eine Datei geöffnet halten, wenn die Datei da und schreibgeschützt ist, läuft das Programm irgendwo. |
Re: PostMessage systemweit senden?
Hallo StuffMasterz,
Zitat:
@vjay: dann aendere ich den Namen der exe-Datei und ich kann das Programm doppelt ausfuehren. Ausserdem haben unter XP Eingeschraenkte Benutzer nicht das Recht, Prozesse von anderen Benutzern aufzulisten, IIRC koennen das nur Administratoren. Greetz alcaeus |
Re: PostMessage systemweit senden?
Hallo StuffMaster,
vielleicht könntest du das Ganze über einen Registry-Wert lösen:
Delphi-Quellcode:
Das hat aber den Nachteil, dass Admin-Rechte gebraucht werden... Oder du löst das Ganze über eine Datei. Die kann allerdings vom Nutzer leichter gelöscht werden.
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FAppIsRunning: Boolean; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} const RegPath = 'Software\MyApp\'; RegAppRunning = 'AppRunning'; var Reg: TRegistry; procedure TForm1.FormCreate(Sender: TObject); begin Reg := TRegistry.Create(); with Reg do begin RootKey := HKEY_LOCAL_MACHINE; OpenKey(RegPath, True); FAppIsRunning := ValueExists(RegAppRunning); if FAppIsRunning then begin Application.MessageBox('Program is already running!', 'Message'); Application.Terminate(); exit; end else begin WriteBool(RegAppRunning, True); end; CloseKey(); end; end; procedure TForm1.FormDestroy(Sender: TObject); begin with Reg do begin if not FAppIsRunning then begin OpenKey(RegPath, True); DeleteValue(RegAppRunning); CloseKey(); end; Free(); end; end;
Delphi-Quellcode:
Beide Varianten haben den Nachteil, dass nicht garantiert werden kann, ob die Applikation wirklich läuft oder nicht.
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FAppIsRunning: Boolean; FFleHandle: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var AppFile: String; procedure TForm1.FormCreate(Sender: TObject); begin AppFile := 'appdata.dat'; FAppIsRunning := FileExists(AppFile); if FAppIsRunning then begin Application.MessageBox('Program is already running!', 'Message'); Application.Terminate(); exit; end else begin FFleHandle := FileCreate(AppFile); FileSetAttr(AppFile, faHidden); end; end; procedure TForm1.FormDestroy(Sender: TObject); begin if not FAppIsRunning then begin FileClose(FFleHandle); DeleteFile(AppFile); end; end; Außerdem hast du bei einem Programmabsturz ein kleines Problem, da könnte evtl. eine Abfrage des Dateidatums helfen... Grüße, Marco |
Re: PostMessage systemweit senden?
Zitat:
Zitat:
|
Re: PostMessage systemweit senden?
Danke, dass mit der Datei hatte ich mir auch schon gedacht, aber ich dachte auch, die Lösung sei nicht besonders elegant und hatte deshalb bei den Messages angesetzt.
Das mit der Registry kam für mich aufgrund der geforderten Rechte nicht in Frage. @alcaeus Das Programm an sich kann schon problemlos mehrmals gestartet werden. Aber es ist nicht besonders wünschenswert. Danke erstmal für die tollen Antworten Ich werde mal die Variante mit der temporären Datei probieren. Grüße StuffM |
Re: PostMessage systemweit senden?
Hallo Vjay,
Zitat:
Zitat:
Gruß, Marco |
Re: PostMessage systemweit senden?
Zitat:
Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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-2025 by Thomas Breitkreuz