AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PostMessage systemweit senden?

Ein Thema von Unplugged · begonnen am 16. Jun 2005 · letzter Beitrag vom 16. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Unplugged

Registriert seit: 14. Apr 2004
Ort: Leipzig
125 Beiträge
 
Delphi 6 Enterprise
 
#1

PostMessage systemweit senden?

  Alt 16. Jun 2005, 09:13
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
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#2

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 10:29
Kurze Antwort: Nein

Wäre ja schlimm wenn man Fenster anderer User/Accounts manipulieren könnte.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Unplugged

Registriert seit: 14. Apr 2004
Ort: Leipzig
125 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 12:51
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.
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#4

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 13:12
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.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 13:33
Hallo StuffMasterz,

Zitat von StuffMasterz:
hast du vielleicht ne andere Idee, wie ich verhindern kann, dass ein Programm mehrmals auf einem Rechner gestartet wird.
Die Frage ist, warum es auch ausserhalb eines Useraccounts nicht mehr ausgefuehrt werden darf. Was soll das Programm machen? Wenn es ein Programm ist, das irgendwelche Systemaufgaben erledigt, und deshalb nur einmal laufen darf, wuerde ich es mit einem Dienst machen, der (natuerlich) im Hintergrund laeuft. Dazu gibts dann ein zweites Programm um den Dienst zu konfigurieren, und dort kannst du auch ansetzen: Das zweite Programm verbindet sich irgendwie mit dem Dienst, und wenn bereits eine Instanz verbunden ist...ja, du siehst wo das hingeht

@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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#6

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 13:39
Hallo StuffMaster,
vielleicht könntest du das Ganze über einen Registry-Wert lösen:
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
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;
Beide Varianten haben den Nachteil, dass nicht garantiert werden kann, ob die Applikation wirklich läuft oder nicht.
Außerdem hast du bei einem Programmabsturz ein kleines Problem, da könnte evtl. eine Abfrage des Dateidatums helfen...

Grüße, Marco
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#7

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 13:55
Zitat von Marphy:
Oder du löst das Ganze über eine Datei. Die kann allerdings vom Nutzer leichter gelöscht werden.
Na das will ich sehen, wenn die Datei von der Application geöffnet bleibt. Wenn das funktioniert ess ich nen Keks und schmeiss Windows runter Okay umbenennen könnte der User sie, aber es geht hier glaube ich auch nicht um eine hackingsicheres Verfahren, sondern um eine einfache Möglichkeit festzustellen ob das Programm schon läuft - habe ich jedenfalls so verstanden. Der User kann imho immer manipulieren , das gilt genauso für den Dateinamen des Programms (für suche in Prozessliste) als auch für die Routine die das ganze überprüft im Programm. Die Frage ist immer nur wie einfach die Angelegenheit für den User ist und ob das ganze überhaupt in die Richtung geschützt werden soll. Ich vermute eher dass er sein Programm bei jedem User im Autostart hat und doppelte Ausführung verhinden möchte.

Zitat von Marphy:
Beide Varianten haben den Nachteil, dass nicht garantiert werden kann, ob die Applikation wirklich läuft oder nicht.
Außerdem hast du bei einem Programmabsturz ein kleines Problem, da könnte evtl. eine Abfrage des Dateidatums helfen...
Nein, er versucht beim Start die Datei zu createn, wenn dies nicht funktioniert läuft die Anwendung bereits. Wenn es funktioniert lässt er das Dateihandle offen und schließt es beim Beenden wieder. Wenn die Anwendung abstürzt sollte Windows "eigentlich" die Datei wieder entsperren, funktioniert nach eigener Erfahrung aber nicht immer....
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Unplugged

Registriert seit: 14. Apr 2004
Ort: Leipzig
125 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 14:08
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
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#9

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 14:09
Hallo Vjay,

Zitat von Vjay:
Zitat von Marphy:
Oder du löst das Ganze über eine Datei. Die kann allerdings vom Nutzer leichter gelöscht werden.
Na das will ich sehen, wenn die Datei von der Application geöffnet bleibt. Wenn das funktioniert ess ich nen Keks und schmeiss Windows runter Okay umbenennen könnte der User sie, [...]
Hey, du hast Recht! Hab das Progrämmchen entsprechend umgeschrieben (siehe vorheriges Posting). Nicht einmal das Umbenennen funktioniert...

Zitat:
Nein, er versucht beim Start die Datei zu createn, wenn dies nicht funktioniert läuft die Anwendung bereits. Wenn es funktioniert lässt er das Dateihandle offen und schließt es beim Beenden wieder. Wenn die Anwendung abstürzt sollte Windows "eigentlich" die Datei wieder entsperren, funktioniert nach eigener Erfahrung aber nicht immer....
Die Entsperrung klappt, aber es geht ja darum, dass nach einem Programmabsturz die Datei erhalten bleibt, folglich die Anwendung nicht mehr gestartet werden kann...

Gruß, Marco
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#10

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 14:11
Zitat von StuffMasterz:
Das Programm an sich kann schon problemlos mehrmals gestartet werden. Aber es ist nicht besonders wünschenswert.
Dann lass es. Spaetestens bei Loesungen wie Terminal Servers, wo Benutzer auf dem Server angemeldet sind und die Anwendungen auch dort laufen, wirst du mit so einem Programm auf wenig Gegenliebe stossen. Wenn das Programm etwas macht, das nicht zweimal zur gleichen Zeit laufen darf, mach einen Dienst, wenn nicht vergiss die Idee, ist wohl das beste

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz