Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Eigene Anwendung/Fenster nach vorne holen per Shortcut (https://www.delphipraxis.net/171956-eigene-anwendung-fenster-nach-vorne-holen-per-shortcut.html)

Jumpy 4. Dez 2012 11:03

Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Hallo,

ich hab ein Programm erstellt, das im Prinzip nur gewisse Informationen auf einem Form anzeigt. Die Nutzer haben die Möglichkeit es in den Optionen als StayOnTop einzustellen und dann legt es sich über alle anderen Programme und ist immer nutzbar.
Manche User betreiben es aber lieber im normalen Modus, d.h. nach und nach legen sich andere Programme darüber. Jetzt wäre es schön, wenn man das mit einem Windows-weiten Tastatur-Shortcut oder ähnlichem wieder nach vorne holen könnte.
Es hat keinen Eintrag in der Taskbar, aber ein Taskbar-Icon, über das man das nach vorne holen kann, dieses wird aber von Windows gelegentlich ausgeblendet, so dass man ggf. zwei Mausklicks braucht, um das Fenster darüber zu öffnen.
Es ist also eine Möglichkeit da, das Fenster zu erreichen, aber ich und auch einige der User, hätten gerne eine Tastenkombi mit der das geht.

Kann man in das Programm irgenwas einbauen, um ShortCuts zu empfangen oder bei Windows zu regisrieren oder sowas?

--------

Ich habe in das Programm einen Mutex eingebaut. Wird das Programm erneut gestartet, so wird die alte Instanz nach vorne geholt und die neue wieder beendet.
D.h. wenn es einen Möglichkeit gäbe Programme per Short-Cut zu starten, würde mir das auch schon reichen.

Wäre schön, wenn da jemand Infos hätte ob/wie das geht. Suche nach BringToFront usw. hat mir nichts beschert, bei den Ergebnissen geht es meist um Programm-Interne Abläufe, während ich ja von ausserhalb auf mein Programmfenster Einfluss nehmen will.

Bummi 4. Dez 2012 11:16

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Delphi-Quellcode:
unit unit3;
interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
     procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
  end;

var
  Form3: TForm3;

implementation


{$R *.dfm}


{ TForm3 }

const
  HotkeyID=12345;

procedure TForm3.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Handle, HotkeyID , MOD_CONTROL, VK_F10);
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle, HotkeyID);
end;

procedure TForm3.WMHotKey(var Message: TMessage);
begin
   Showmessage('Hallo')
end;

end.

Jumpy 4. Dez 2012 14:48

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Danke Bummi für den Ansatz. Leider bekomme ich es nicht so recht ans Laufen. Vllt. ist meine Konstellation zu speziell?

Ich habe eine MainForm, die ist (in der Regel) ausgeblendet:
Delphi-Quellcode:
Application.ShowMainForm:= false;
ShowWindow(Application.Handle, SW_HIDE) ;
SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ;
Das angezeigte Form hab ich mit deinem Code versehen, erstmal inklusive Showmessage. Das showmessage kommt nicht.

Dann hab ich deinen Code mal in die MainForm verlegt und diese sichtbar gelassen. Da kommt das showmessage. Liegen jedoch andere Anwendungen über meiner, so seh ich das showmessage gar nicht, erst, wenn ich in der Taskleiste auf das Icon der MainForm klicke. Zudem bringt das
Delphi-Quellcode:
SetForegroundWindow(DF.Handle);
Mir mein Anzeigefenster auch nicht nach vorne.

Ich habe so dass Gefühl, dass es klappen würde, wenn ich mich in einem anderen Fenster meiner Anwendung befinde, kann das sein? Oder müsste das wenn dann immer klappen, auch wenn kein Fenster meiner Anwendung den Fokus hat?

Pfaffe 4. Dez 2012 15:20

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Es geht auch mit Windows Bordmittel:
Lege von Deinem Programm eine Verknüpfung an.
Dann mit rechter Maustaste auf die Verknüpfung klicken und Menüpunkt Eigenschaften wählen.
Im Dialog Eigenschaften auf der Lasche Verknüpfung kann der Anwender eine Tastenkombination festlegen indem er den Cursor in das Eingabefeld setzt und die gewünschte Taste drückt.

Bummi 4. Dez 2012 15:39

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Ich weiß ja nicht was genau Du machst, aber so etwas geht auch ....

Delphi-Quellcode:
program Project2;

uses
  Windows,Forms, messages,Dialogs,
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}
var
  FHandle:Cardinal;
const
  HotkeyID=12345;
  type
  TDummy=Class
     Class procedure MyOnMessage(var Msg: TMsg; var Handled: Boolean);
  End;




{ TDummy }

class procedure TDummy.MyOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if msg.message=WM_HOTKEY then
    begin
       Showmessage('Hallo');
       Handled := true;
    end
  else
    begin
       Handled := false;
    end;

end;

begin

  Application.Initialize;
  RegisterHotKey(Application.Handle, HotkeyID , MOD_CONTROL, VK_F10);
  FHandle := Application.Handle;
  Application.ShowMainForm:= false;
  ShowWindow(Application.Handle, SW_HIDE) ;
  SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ;
  Application.CreateForm(TForm3, Form3);
  Application.OnMessage := TDummy.MyOnMessage;
  Application.Run;

  UnregisterHotKey(FHandle, HotkeyID);
end.

Jonas Shinaniganz 4. Dez 2012 17:16

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Schließe mich Pfaffe an, weil: dafür würde ich nicht extra ein Programm erweitern. Die Windows Funktion funktioniert wunderbar. Grüße

Jumpy 5. Dez 2012 08:01

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Irgendwie hatte ich gestern einen schlechten Tag. Bummis erste Lösung funktioniert genau wie angegeben. Ich war nur irgendwie mit den Handeln durcheinander gekommen. Eingebaut hab ich es nun in die MainForm und in der dann aufgerufenen Funktion benutze ich SetForegroundWindow nun mit dem Handle des Forms, dass ich nach vorne holen will und so klappt's dann.

Ein anderer Denkfehler war, das SetForegroundWindow nach einem showmessage zu platzieren. So kamm das versteckte ShowMessage mit dem OK-Button, dass ich aber nicht sehen konnte, weil es hinter anderen Fenstern versteckt war (k.A. warum das showmessage nicht System-Modal ist oder ist das bei keiner Anwendung so? Erinner mich gerade nicht). Da ich so zunächst nie OK klicken konnte, kam auch das Fenster nicht nach vorne.
Kommt das Showmessage nach dem SetForegroundWindow klappte es dann natürlich.

Es gibt halt Tage an denen ich wünschte ich wäre ein Kaffee-Trinker und könnte mir mit einer Kanne Kaffee die Spinnweben aus dem Kopf spülen :-D

@Pfaffe/Jonas:
Habt natürlich irgendwo recht, aber ich haue in dem Fall lieber 10 Zeilen mehr in den Quellcode, als bei 40 Kollegen rumzurennen und denen den Short-Cut einzurichten. Darauf würde das nämlich hinauslaufen, wie ich unseren Haufen hier kenne.

Jumpy 12. Dez 2012 11:01

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Hallo,

ich muss das nochmal rauskramen hier, weil ich da eine kleine Abwandlung brauche. Ich schaffe es das betroffene Fenster nach vorne zu holen:

Delphi-Quellcode:
procedure TMain.WMHotKey(var Message: TMessage);
begin
  SetForegroundWindow(DF.Handle);
end;
Aber der Fokus ist noch bei einer Anwendung/Fenster die/das vorher den Fokus hatte (sprich Fenster-Rahmen ist oben noch blau). Wie hole ich mein Fenster/Anwendung nicht nur nach vorne, sondenr geb ihr auch den Fokus bzw. mach sie zur aktiven Anwendung?

DeddyH 12. Dez 2012 12:27

AW: Eigene Anwendung/Fenster nach vorne holen per Shortcut
 
Nicht ausprobiert, aber klappt es mit MSDN-Library durchsuchenBringWindowToTop?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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