Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Form inaktiv anzeigen (https://www.delphipraxis.net/32696-form-inaktiv-anzeigen.html)

Shaman 27. Okt 2004 12:21


Form inaktiv anzeigen
 
Hallo zusammen

Wie kann ich eine Form inaktiv anzeigen lassen, also so, dass der Fokus bei dem Fenster bleibt, welches ihn schon vor dem Anzeigen meiner Form hatte. Wichtig ist, dass das letzte Fenster den Fokus gar nicht erst verliert.

Gruss
Shaman

eassy 27. Okt 2004 12:29

Re: Form inaktiv anzeigen
 
hi,

eine möglichkeit ist es, unter der methode onactivate durch
form1.setfocus (des vorigen fenster) den focus zu setzen.

gruß
eassy

Shaman 27. Okt 2004 12:43

Re: Form inaktiv anzeigen
 
Hoi

Es handelt sich um die MainForm, die den Fokus gar nicht erst erhalten darf. Wenn meine Anwendung startet, muss das vorherige Fenster aktiv bleiben.

Shaman 28. Okt 2004 15:27

Re: Form inaktiv anzeigen
 
Schwupps

Stevie 28. Okt 2004 16:44

Re: Form inaktiv anzeigen
 
Das ist relativ schwierig (hab gerade mal in der VCL rumgedebuggt... ;-)), wenn nicht gar unnöglich.
Warum ist das denn so wichtig? Wie rufst du denn dein Programm auf? Würde ja nur aus der anderen
Anwendung möglich sein, denn sonst wär der Fokus ja schon vorher weg, gell? :gruebel:

P.S.: Ich glaub, ich hab ne Idee:
Du musst die Methode CMShowingChanged überschreiben, denn dort wird die API-Funktion ShowMWindow aufgerufen und ihr anhand des WindowStates der Parameter SW_SHOWNORMAL, SW_SHOWMINNOACTIVE oder SW_SHOWMAXIMIZED übergeben. Was du aber benötigst, ist der Parameter SW_SHOWNOACTIVATE. Ich probiers mal aus...

Shaman 28. Okt 2004 17:08

Re: Form inaktiv anzeigen
 
Es geht eben um eine Art HintWindow, nur mit Controls drinnen. Nun sieht es halt einfach besser aus, wenn das Fenster seine aktive Titelleiste beibehält, wenn das HintWindow angezeigt wird.

Gruss
Shaman

Stevie 28. Okt 2004 17:13

Re: Form inaktiv anzeigen
 
Von wo aus wird denn deine HintWindow-App aufgerufen?
Kannst du das HintWindow nicht in die andere App bringen?
Du könntest doch auch im OnActivate des HintWindows den Fokus wieder zurücksetzen.

Hmm, das mit dem Überschreiben ist Käse, aber nen API-Hook auf die ShowWindow könnte gehen... mal sehen...

Shaman 28. Okt 2004 17:21

Re: Form inaktiv anzeigen
 
Ich habe eine ListBox auf einer Form, die irgendwo auf dem Desktop angezeigt werden soll, sobald man einen HotKey drückt.

Ich weiss nicht, wie ich das hinkriegen soll... Aber der Witz ist ja, in einem anderen Programm von mir ist genau dieser Effekt unerwünscht auf einmal aufgetreten, dass die MainForm beim Start inaktiv angezeigt wurde und es auch blieb, selbst wenn man sie anklickte etc. Nur konnte ich beim besten Willen nicht herausfinden woran das lag und es somit auch nicht reproduzieren... :gruebel:

Shaman 28. Okt 2004 17:30

Re: Form inaktiv anzeigen
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ParentWindow:= GetForegroundWindow;
  Show;
end;
So sollte es aussehen, aber es müsste eben noch über das aktive Fenster hinaus angezeigt werden, falls dieses zu klein ist.

Stevie 28. Okt 2004 17:38

Re: Form inaktiv anzeigen
 
So, bitteschön! Form wird erst bei einem Klick aktiviert! :mrgreen:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, afxCodeHook;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  end;

var
  Form1: TForm1;
  ShowWindowNextHook: function(hWnd: HWND; nCmdShow: Integer): LongBool; stdcall;

function ShowWindowHookProc(hWnd: HWND; nCmdShow: Integer): LongBool; stdcall;

implementation

{$R *.dfm}

function ShowWindowHookProc(hWnd: HWND; nCmdShow: Integer): LongBool; stdcall;
begin
  if nCmdShow = SW_SHOWNORMAL then
    Result := ShowWindowNextHook(hWnd, SW_SHOWNOACTIVATE)
  else
    Result := ShowWindowNextHook(hWnd, nCmdShow);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowMessage('Test!');
end;

initialization
  HookCode('user32', 'ShowWindow', @ShowWindowHookProc, @ShowWindowNextHook);

finalization
  UnHookCode(@ShowWindowNextHook);

end.
Die afxCodeHook-Lib gibts hier!

Shaman 28. Okt 2004 17:42

Re: Form inaktiv anzeigen
 
Hey, danke dass Du dir so eine Mühe gemacht hast :thumb: , aber soweit bin ich auch schon gekommen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Handle, SW_SHOWNOACTIVATE);
end;
Das macht das gleiche, oder? Nur soll die Form eben auch inaktiv bleiben, wenn sie geklickt wird.

Stevie 28. Okt 2004 17:48

Re: Form inaktiv anzeigen
 
Zitat:

Zitat von Shaman
Hey, danke dass Du dir so eine Mühe gemacht hast :thumb: , aber soweit bin ich auch schon gekommen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Handle, SW_SHOWNOACTIVATE);
end;
Das macht das gleiche, oder? Nur soll die Form eben auch inaktiv bleiben, wenn sie geklickt wird.

:wall: Toll, und ich hook hier rum! :mrgreen:
Tja, jetzt hab ich aber nen simplen Tip Enabled := False.... :roll:

Shaman 28. Okt 2004 17:49

Re: Form inaktiv anzeigen
 
Ja, aber die ListBox soll man klicken können :wink:
Aber ich glaube, mit der ParentWindow-Variante könnte sich was basteln lassen...

Stevie 28. Okt 2004 17:56

Re: Form inaktiv anzeigen
 
Zitat:

Zitat von Shaman
Ja, aber die ListBox soll man klicken können :wink:
Aber ich glaube, mit der ParentWindow-Variante könnte sich was basteln lassen...

:gruebel: Wie soll das denn gehen? Wenn du die ListBox anwählst, wird auch das Fenster angewählt,
und somit das andere Fenster inaktiv gezeichnet. Und wenn du den Fokus wieder manuell zurücksetzt... :freak:

... ich glaub es reicht langsam für heute :roteyes:

Der_Ventilator 24. Apr 2005 11:48

Re: Form inaktiv anzeigen
 
Zitat:

Zitat von Shaman
Hey, danke dass Du dir so eine Mühe gemacht hast :thumb: , aber soweit bin ich auch schon gekommen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Handle, SW_SHOWNOACTIVATE);
end;
Das macht das gleiche, oder? Nur soll die Form eben auch inaktiv bleiben, wenn sie geklickt wird.

Wie kann ich die Form nicht beim OnCreate inaktiv anzeigen, sondern immer wieder mal im Programmablauf?

fkerber 24. Apr 2005 12:21

Re: Form inaktiv anzeigen
 
Hi!

Mit nem Timer z.B.?


Ciao Frederic

Sharky 24. Apr 2005 12:37

Re: Form inaktiv anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hai Shaman,

ich bin nicht sicher ob ich dich richtig verstanden habe. Aber Du brauchst doch nur den Parent zu setzen. Oder gleich mit .CreateParented arbeiten?
Im Anhang mal mein mini Projekt.

Der_Ventilator 24. Apr 2005 16:36

Re: Form inaktiv anzeigen
 
Zitat:

Zitat von fkerber
Hi!

Mit nem Timer z.B.?


Ciao Frederic

Ich mein, wie ruf ich " ShowWindow(Handle, SW_SHOWNOACTIVATE); " angewand auf meine 2. Form aus dem Hauptprogramm auf?

procedure form1.zeige;
begin

Form2.ShowWindow(Handle, SW_SHOWNOACTIVATE);

end;

akzeptiert Delphi jedenfalls nicht.


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