AGB  ·  Datenschutz  ·  Impressum  







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

FindWindow

Ein Thema von derseitzer · begonnen am 3. Feb 2017 · letzter Beitrag vom 8. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

AW: FindWindow

  Alt 4. Feb 2017, 01:21
Ach ja, Delphi-Fenster sind "Windows" (CreateWindow) und keine "Dialoge" (CreateDialog/CreateDialogIndirect).

BM_CLICK ist aber eine DialogMessage.

Und selbst wenn es ein Dialog wäre, sagt die Hilfe auch noch
Zitat:
Remarks
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
Bei Windows verarbeitet das Control (hier der Button) selber seine Klick-Events und bei Dialogs steckt die Event-Behandlung im Dialog (das Hauptfenster)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Feb 2017 um 01:37 Uhr)
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#2

AW: FindWindow

  Alt 4. Feb 2017, 06:35
Statt jedes einzelne Objekt zu suchen, ist es ausreichend, nur das Empfänger-Window zu suchen und dem die Messages zu senden.
Delphi-Quellcode:
SENDER:

var
  Form1: TForm1;
  aWnd : HWND;

const
    WM_MY_MESSAGE = WM_USER + 10; //1034

implementation

{$R *.dfm}

procedure TForm1.bnMINIMIZEClick(Sender: TObject);
begin if aWnd<>0 then Postmessage(aWnd,WM_SYSCOMMAND, SC_MINIMIZE,0); end;

procedure TForm1.bnRESTOREClick(Sender: TObject); // SC_RESTORE
begin
aWnd := FindWindow(NIL, 'WindowProc');
  if aWnd<>0 then
  BEGIN
      Postmessage(aWnd,WM_SYSCOMMAND, SC_RESTORE,0);
      SetForegroundwindow(aWnd);
      SendMessage(aWnd, WM_SYSCOMMAND, SC_RESTORE, aWnd);
  END;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
SendMessage(aWnd, WM_MY_MESSAGE, 123, 1);
SendMessage(aWnd, WM_MY_MESSAGE, 123, 2);
SendMessage(aWnd, WM_MY_MESSAGE, 123, 3);
SendMessage(aWnd, WM_MY_MESSAGE, 123, 4);
SendMessage(aWnd, WM_MY_MESSAGE, 123, 5);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin aWnd := FindWindow(NIL, 'WindowProc'); end; //sucht Empfänger

procedure TForm1.bnCLOSEClick(Sender: TObject);
begin
if aWnd<>0 then Postmessage(aWnd,WM_SYSCOMMAND,SC_CLOSE,0); //Close Empfänger
Application.Terminate; //Close Sender
end;

end.
//---------------------------------------------------------
EMPFÄNGER:

  protected
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form1: TForm1;

const
    WM_MY_MESSAGE = WM_USER + 10; //1034

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_MY_MESSAGE: BEGIN
      case Message.LParam of
      1: PostMessage(Button1.Handle, BM_CLICK, 0, 0);
      2: PostMessage(Button2.Handle, BM_CLICK, 0, 0);
      3: PostMessage(Button3.Handle, BM_CLICK, 0, 0);
      4: PostMessage(Button4.Handle, BM_CLICK, 0, 0);
      5: PostMessage(Button5.Handle, BM_CLICK, 0, 0);
      end;
    END;
  end;
end;

procedure TForm1.bnCLEARClick(Sender: TObject);
begin Memo1.clear; end;

procedure TForm1.Button1Click(Sender: TObject);
begin Memo1.Lines.Add('B1'); end;

procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Lines.Add('B2'); end;

procedure TForm1.Button3Click(Sender: TObject);
begin Memo1.Lines.Add('B3'); end;

procedure TForm1.Button4Click(Sender: TObject);
begin Memo1.Lines.Add('B4'); end;

procedure TForm1.Button5Click(Sender: TObject);
begin Memo1.Lines.Add('B5'); end;
Angehängte Dateien
Dateityp: zip WndProcTest.zip (1,69 MB, 15x aufgerufen)

Geändert von t.roller ( 4. Feb 2017 um 07:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#3

AW: FindWindow

  Alt 4. Feb 2017, 07:39
Zu dem Beispiel:
  • Prozessübergreifend keine UserMessages (WM_USER), sondern besser MSDN-Library durchsuchenRegisterWindowMessage verwenden.
    WM_USER sind nur für das eine Objekt, bzw. für diesen Objekt-Typ (Klasse) gültig.
    WM_APP sind global in der Anwendung gültig. (alle Fensterklassen der Anwendung kennen entweder diese ID nicht, oder sie haben hinter der Message-ID die gleiche Funktion liegen)
    Sollte man mal "ausversehn" ein falsches Objekt erwischen und das hat zufällig eine Message mit der gleichen ID, dann passiert wer weiß was und das will niemand.
  • Kein BM_CLICK, wie es schon mehrmals genannt wurde.
  • Und warum greifst du in deinem Code auf die globale Variable Form1 zu? (aus der TForm1-Instanz heraus)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Feb 2017 um 07:44 Uhr)
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#4

AW: FindWindow

  Alt 4. Feb 2017, 07:51
Zu dem Beispiel:
...Und warum greifst du in deinem Code auf die globale Variable Form1 zu? (aus der TForm1-Instanz heraus)
Das ist ein typischer Copy&Paste-Fehler aus einem anderen Programm, das parallel in einer anderen IDE liegt. Ich habe es oben geändert.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#5

AW: FindWindow

  Alt 4. Feb 2017, 13:08
Sollte man mal "ausversehn" ein falsches Objekt erwischen und das hat zufällig eine Message mit der gleichen ID, dann passiert wer weiß was und das will niemand.
Stimmt! Ich habe vor einigen Monaten eine sowjetische "vergessene" Atombombe in der Nähe von Dresden gefunden und versuche seitdem, die richtigen Wparam- und Lparam-Werte herauszufinden.
Das kann noch Jahre dauern...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: FindWindow

  Alt 4. Feb 2017, 13:58
Ach ja, Delphi-Fenster sind "Windows" (CreateWindow) und keine "Dialoge" (CreateDialog/CreateDialogIndirect).

BM_CLICK ist aber eine DialogMessage.
Hä? Das wäre mir neu, dass die Nachricht nur mit Dialogen funktioniert. Im Gegenteil: https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: FindWindow

  Alt 4. Feb 2017, 15:44
Ach ja, Delphi-Fenster sind "Windows" (CreateWindow) und keine "Dialoge" (CreateDialog/CreateDialogIndirect).

BM_CLICK ist aber eine DialogMessage.
Hä? Das wäre mir neu, dass die Nachricht nur mit Dialogen funktioniert. Im Gegenteil: https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
Wo ist das Problem?
Die Aussage von @himitsu ist definitiv nicht korrekt.
Fenster ist Fenster ob Dialog oder Window beides wird letztendlich über CreateWindow erstellt.
Wobei beim erstellen des Dialogs lediglich das Ex angehängt wird.
Die Messagen jedoch sind für alle gleich.

Davon sind natürlich spezielle Konstanten wie für, bsp. ListBoxen ausgeschlossen.

Zitat:
The CreateDialog function uses the CreateWindowEx function to create the dialog box
gruss

Geändert von EWeiss ( 4. Feb 2017 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: FindWindow

  Alt 4. Feb 2017, 16:06
Hier gibt es kein Problem. Wie du schon sagst, habe ich himitsui nur korrigiert. Aber Dialoge werden nicht mit CreateWindowEx erstellt, wie du behauptest, sondern per Ressource.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: FindWindow

  Alt 4. Feb 2017, 16:28
Hier gibt es kein Problem. Wie du schon sagst, habe ich himitsui nur korrigiert. Aber Dialoge werden nicht mit CreateWindowEx erstellt, wie du behauptest, sondern per Ressource.
Da muss ich dich leider korrigieren.
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

Entweder ist MS doof oder ich..
Habe es doch deutlich als Quote markiert.
Muss mich aber deshalb jetzt nicht streiten du kannst sie ja über Ressourcen erstellen ich verwende CreateWindowEx btw.. wird diese über CreateDialog aufgerufen.

Zitat:
The CreateDialog function uses the CreateWindowEx function to create the dialog box. CreateDialog then sends a WM_INITDIALOG message, bla, bla
gruss

Geändert von EWeiss ( 4. Feb 2017 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: FindWindow

  Alt 4. Feb 2017, 20:42
Richtig. Aber mit CreateWindowEx kann man auch ganz "normale" Fenster erstellen. Wenn ich CreateWindowEx verwende dann bekomme ich ein normales Fenster. Heißt im Umkehrschluss, dass Dialoge auch nur normale Fenster sind, die aber vom DialogMenager gesteuert werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 10:46 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