AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Rechtsklick in minimierter Caption abfangen

Rechtsklick in minimierter Caption abfangen

Ein Thema von Amateurprofi · begonnen am 24. Mai 2019 · letzter Beitrag vom 21. Jun 2021
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.717 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Rechtsklick in minimierter Caption abfangen

  Alt 27. Mai 2021, 12:57
Zitat:
PostMessage(Win,$7FFF,0,0);
$7FFF: Nein!

A) Man verwendet niemals nichtssagende Werte (MagicValue), vor allem nicht, wenn es entsprechende Konstanten gibt. (WM_USER+X)
B) Außerdem liegt dieser Wert auch noch im falschen Bereich. (MSDN-Library durchsuchenWM_APP+X)
C) Man sollte muß für sowas prozessübergreifendes MSDN-Library durchsuchenRegisterWindowMessage verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Mai 2021 um 13:00 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
941 Beiträge
 
Delphi XE2 Professional
 
#12

AW: Rechtsklick in minimierter Caption abfangen

  Alt 28. Mai 2021, 00:34
Zitat:
PostMessage(Win,$7FFF,0,0);
$7FFF: Nein!

A) Man verwendet niemals nichtssagende Werte (MagicValue), vor allem nicht, wenn es entsprechende Konstanten gibt. (WM_USER+X)
B) Außerdem liegt dieser Wert auch noch im falschen Bereich. (MSDN-Library durchsuchenWM_APP+X)
C) Man sollte muß für sowas prozessübergreifendes MSDN-Library durchsuchenRegisterWindowMessage verwenden.
$7FFF: Doch!

Aus "About Messages and Message Queues" Kapitel "Application-Defined Messages"

Zitat:
Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers for private window classes.
Aber vielleicht hab ich das falsch verstanden.
Wie auch immer, so wie ich es gemacht habe funktioniert es.

Wo siehst du den Unterschied zwischen $7FFF und WM_USER+X wo bei letzterem das X auch ein willkürlich festgelegter Wert ist.

In dem Musik-Programm, das der Empfänger der Message ist, sind diverse Users-Messages definiert

Code:
   UM_GetInfo=WM_User;
   UM_SettingsChanged=UM_GetInfo+1;
   UM_OverWrite=UM_SettingsChanged+1;
   UM_RichEditVScroll=UM_OverWrite+1;
   UM_DurationCount=UM_RichEditVScroll+1;
   UM_DurationDone=UM_DurationCount+1;
   UM_RepaintListBoxes=UM_DurationDone+1;
   UM_SetInfo=UM_RepaintListBoxes+1;
   ...
   UM_ToggleMusic=$7FFF;
und, wie du sehen kannst, ist die letzte "UM_ToggleMusic=$7FFF".
Was für einen Sinn macht es, diese auch in meinem kleinen Progrämmchen mit einem Namen zu versehen?
Ich würde das einsehen wenn wie z.B. in der Vcl diese Konstante "Global" verfügbar wäre (Wobei das wahrscheinlich irgendwie machbar wäre).
Da das hier aber nicht der Fall ist, bringt es aus meiner Sicht keinen Vorteil, auch in dem sendenden Programm die Konstante "UM_ToggleMusic=$7FFF" zu definieren.

Trotzdem: Danke für den Hinweis.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.717 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Rechtsklick in minimierter Caption abfangen

  Alt 28. Mai 2021, 00:39
Unterschied?

Man sieht was das zu bedeuten hat!



Außerdem geh immer davon aus, dass deine Message mal ausversehn an ein falsches Programm geht, und wenn es "zufällig" auch auf diese Message-ID reagiert, dann kann sonstwas passieren.
(immerhin gibt es gefühlt 2 Milliarden Music Player, wovon bestimmt irgendwo mal Einer genau die selbe nichtssagende Caption besitzt)

WM_USER und WM_APP am Besten nur programmintern verwenden,
und wenn es zu "anderen" Programmen geht, dann RegisterWindowMessage und schon kann es keine Konflikte geben. (außer jemand hat den selben "Namen" für eine andere Funktion, aber dann war eben der Name einfach nicht eindeutig/gut genug)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (28. Mai 2021 um 00:42 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
941 Beiträge
 
Delphi XE2 Professional
 
#14

AW: Rechtsklick in minimierter Caption abfangen

  Alt 29. Mai 2021, 03:52
Unterschied?

Man sieht was das zu bedeuten hat!



Außerdem geh immer davon aus, dass deine Message mal ausversehn an ein falsches Programm geht, und wenn es "zufällig" auch auf diese Message-ID reagiert, dann kann sonstwas passieren.
(immerhin gibt es gefühlt 2 Milliarden Music Player, wovon bestimmt irgendwo mal Einer genau die selbe nichtssagende Caption besitzt)

WM_USER und WM_APP am Besten nur programmintern verwenden,
und wenn es zu "anderen" Programmen geht, dann RegisterWindowMessage und schon kann es keine Konflikte geben. (außer jemand hat den selben "Namen" für eine andere Funktion, aber dann war eben der Name einfach nicht eindeutig/gut genug)
Das sehe ich doch: Es wird $7FFF gesendet.
Nee, die Message wird nicht "aus versehen" an irgendein anderes Programm gesendet.
Warum nicht?!
Weil nur ich diese Routine verwende, und auf meinem Rechner eben kein anderes Programm läuft, das diese Caption hat.
Deine Einwände sind völlig in Ordnung, wenn es sich um kommerzielle Programme handelt, die dann eventuell auf Rechnern laufen, auf denen andere Bedingungen herrschen.
Das ist aber nicht der Fall, weil, wie gesagt: Meine Programme und ausschließlich mein Rechner.
RegisterWindowMessage hatte ich mir auch angeschaut, aber anfangs nicht verstanden, weil man da nur einen String als Parameter übergeben kann, aber keinen Wert.
Jetzt, nach Lesen deines Beitrags, hab ich mir das noch mal angeschaut und mir ist klar geworden, dass der Wert von Windows festgelegt wird. Deswegen also Danke!
Was ich dabei aber immer noch nicht richtig verstehe:
Wenn ich das empfangende Programm kompiliere steht ja noch kein numerischer Wert für die Message fest.
Ich schließe daraus, dass beide, das sendende Programm und das empfangende Programm, die Message "registern" müssen.
Ist das richtig?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
941 Beiträge
 
Delphi XE2 Professional
 
#15

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 13:03
Das in #10 gezeigte Programm macht, wenn ich AltGr+. drücke, folgendes:
A) Wenn das Programm "Music.exe" läuft: Sendet eine Message an "Music.exe", die dort verarbeitet wird und das Abspielen von MP3s startet oder stoppt.
B) sonst: Öffnet Music.exe.

Die Code-Sequenz in den ersten 3 Zeilen nach "begin" soll bewirken, dass das Programm nicht angezeigt wird (hab ich im INet gefunden).
Leider funktioniert das nicht.
Frage:
Wie kann ich verhindern, dass das Programm angezeigt wird, auch nicht kurz "aufblitzt"?


Delphi-Quellcode:
program ToggleMusic;

{$APPTYPE CONSOLE}

{$R *.res}

uses
   WinApi.Windows, WinApi.ShellApi,
   System.SysUtils;

const MusicPath='E:\Daten\Delphi XE2\Music\Win32\Debug\Music.exe';
var Win:HWND; StartUpInfo:TStartUpInfo; Dsn:String;
begin
   StartupInfo.cb:=SizeOf(StartUpInfo);
   StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
   StartupInfo.wShowWindow:=SW_HIDE;
   Win:=FindWindow(Nil,'Music Player');
   if Win<>0 then begin
      PostMessage(Win,$7FFF,0,0);
   end else begin
      Dsn:=MusicPath;
      if FileExists(Dsn) then
         ShellExecute(0,'open',PWideChar(Dsn),nil,nil,SW_SHOWNORMAL);
   end;
end.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.286 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 13:42
Wenn Du eine TStartupInfo konfigurierst, solltest Du sie zweckmäßigerweise auch nutzen. Oder Du lässt sie ganz weg und änderst im ShellExecute-Befehl SW_SHOWNORMAL in SW_HIDE.
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
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
941 Beiträge
 
Delphi XE2 Professional
 
#17

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 16:18
Wenn Du eine TStartupInfo konfigurierst, solltest Du sie zweckmäßigerweise auch nutzen. Oder Du lässt sie ganz weg und änderst im ShellExecute-Befehl SW_SHOWNORMAL in SW_HIDE.
Danke DeddyH,
aber hilft leider nicht.

Zu "Wenn Du eine TStartupInfo konfigurierst, solltest Du sie zweckmäßigerweise auch nutzen."
Ja, täte ich gern, wenn ich nur wüsste, wie.
Kannst du mir bitte kurz erklären, wie ich die TStartupInfo nutze.

Zu "Oder Du lässt sie ganz weg und änderst im ShellExecute-Befehl SW_SHOWNORMAL in SW_HIDE."
Da hast du etwas falsch verstanden.
Mich stört nicht, dass das ggfs. mit ShellExecute geöffnete Programm sichtbar ist - im Gegenteil, dass soll sichtbar sein.
Aber das Programm, das das ShellExecute ausführt, soll nicht sichtbar sein.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.286 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 16:40
Achso, dann lass doch einfach die Zeile {$APPTYPE CONSOLE} weg.
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 KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.079 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 16:59
Zu "Wenn Du eine TStartupInfo konfigurierst, solltest Du sie zweckmäßigerweise auch nutzen."
Ja, täte ich gern, wenn ich nur wüsste, wie.
Kannst du mir bitte kurz erklären, wie ich die TStartupInfo nutze.
Das ein ein Teil von der CreateProcess() Api. Da findest Du schnell Beispiele.

Als Alternative mag ich noch ShellExecuteEx() hier vorschlagen:
Delphi-Quellcode:

var
  shi: TShellExecuteInfo;
  commandLine: string;
begin
  commandLine := '"A:\Path\a FileName.exe"';
  shi := Default(TShellExecuteInfo);
  shi.cbSize := SizeOf(TShellExecuteInfo);
  shi.lpFile := PChar(commandLine);
  shi.nShow := SW_HIDE;
  ShellExecuteEx(@shi);
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
941 Beiträge
 
Delphi XE2 Professional
 
#20

AW: Rechtsklick in minimierter Caption abfangen

  Alt 21. Jun 2021, 22:24
Achso, dann lass doch einfach die Zeile {$APPTYPE CONSOLE} weg.
Vielen Dank, DeddyH,
funktioniert.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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