Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Schüttel-Funktion / Fenster hin und her schütteln /Windows 7 (https://www.delphipraxis.net/141460-schuettel-funktion-fenster-hin-und-her-schuetteln-windows-7-a.html)

Muchacho 9. Okt 2009 12:08


Schüttel-Funktion / Fenster hin und her schütteln /Windows 7
 
Hi :-D

Die Schüttel-Funktion (Windows 7)

Man greift einfach das momentan aktive Fenster mit der Maus,
schüttelt etwas hin und her und Windows minimiert alle weiteren geöffneten Fenster.

Erneutes Schütteln stellt die Ausgangssituation wieder her.


Wie kann ich das in einer Delphi Anwendung realisieren?

Ich habe hier im Forum lange gesucht und leider nichts zu diesem Thema gefunden.

Für Programmier-Hinweise und Anregungen jeglicher Art wäre ich sehr Dankbar.

Gruß

Muchacho

deadcantdance 9. Okt 2009 12:12

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Habe mich auch schon gewundert, warum das mit Delphi 2007-Anwendungen nicht funktioniert.

Phoenix 9. Okt 2009 12:13

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Also mit Delphi 2010-Anwendungen gehts. Grad getestet.

holliesoft 9. Okt 2009 12:40

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Hmm, bei mir funktioniert es mit einer Delphi 2007 Anwendung...
Mein Fenster geschüttelt - alles andere wird minimiert...
Natürlich nur unter Windows 7 :-)

Bernhard Geyer 9. Okt 2009 12:47

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von deadcantdance
Habe mich auch schon gewundert, warum das mit Delphi 2007-Anwendungen nicht funktioniert.

Vermutlich mußt du Application.MainForm := True (oder wie das genau heißt) setzen. Ich denke das Shaken funktioniert nur mit dem Hauptformular der App (was bis D2007 ja das Versteckte Application-Form ist).

Muchacho 9. Okt 2009 13:36

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Hi

Nachtrag:

Meine Applikation beinhaltet mehrere fsMDIChild (FormStyle) Fenster.

Schüttel-Effekt sollte nur innerhalb meiner Applikation agieren.

Ich sollte zuerst, meine ich, in eine Richtung, die sich aus einem Zusammenspiel

zwischen einem TTimer und dem Ereignis OnResize des Formulars ergibt, gehen.

Muchacho

himitsu 9. Okt 2009 13:44

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
OnResize?

sowas wie OnMove+GetTickCount und einen Schüttel/-Bewegunszähler würde auch noch gehn wäre da wohl besser.


PS: ein problem wirst du dann auch noch haben, wenn ab Windows 7 zusätzlich noch die systemeigene Schüttelfunktion dazukommen ... also du behandelst es nur für deine Anwendung und deren MDI-Formulare, aber Windows macht das parallel auch nochmal für alle Fenster.

holliesoft 9. Okt 2009 13:54

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von Bernhard Geyer
Ich denke das Shaken funktioniert nur mit dem Hauptformular der App (was bis D2007 ja das Versteckte Application-Form ist).

Nö, das war nur bis D2006 Default. Ab D2007 nicht mehr (wegen Vista und der Taskbar-Vorschau-Funktion)

Gruß
Patrick

Muchacho 9. Okt 2009 14:02

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von himitsu
OnResize?

PS: ein problem wirst du dann auch noch haben, wenn ab Windows 7 zusätzlich noch die systemeigene Schüttelfunktion dazukommen ... also du behandelst es nur für deine Anwendung und deren MDI-Formulare, aber Windows macht das parallel auch nochmal für alle Fenster.

Hi, :-D

natürlich Sachen wie Windows 7 werde ich abfangen.

Zuerst möchte ich feststellen können, ob ein Fenster geschüttelt wurde.

Mehr will ich nicht wissen. Alles andere ist leicht zu programmieren. :wall:

Muchacho

Bernhard Geyer 9. Okt 2009 14:07

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von holliesoft
Nö, das war nur bis D2006 Default. Ab D2007 nicht mehr (wegen Vista und der Taskbar-Vorschau-Funktion)

Mein ich ja 8)

himitsu 9. Okt 2009 14:23

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
OK, WM_MOVE geht leider nicht ... das wird nur einmal nach dem Verschieben ausgelöst :wall:

Left und Top ändern sch leider auch erst nach vollendetem Verschieben, aber nicht wärenddessen
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var r: Integer;
begin
  if Left < _y then r := 1 else r := 0;
  if Top < _x then Inc(r, 2);
  if r <> _r then Inc(_c) else _c := 0;
  if _c > 5 then Beep;
  _x := Left;
  _y := Top;
  _r := r;
end;
also geht das auch so auch nicht :wall:

Muchacho 9. Okt 2009 14:36

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Ich denke ich habe eine Idee:

Ich muss mich bei diesem Problem höchstwahrscheinlich überhaupt nicht mit Maus-Ereignissen beschäftigen.
Es reicht doch, wenn ich mir die TForm-Ereignisse Top und Left merken kann.

Klartext:

Wenn in einer gewisser Zeitspanne sich die Form.Top und Form.Left Werte ändern und darüber hinaus in einem bestimmten Bereich bewegen (horizontal und vertikal), dann könnte man annehmen, dass ein Fenster geschüttelt wurde (!)

Was mein Ihr dazu?

Muchacho

Muchacho 9. Okt 2009 14:38

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von himitsu
OK, WM_MOVE geht leider nicht ... das wird nur einmal nach dem Verschieben ausgelöst :wall:

Left und Top ändern sch leider auch erst nach vollendetem Verschieben, aber nicht wärenddessen
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var r: Integer;
begin
  if Left < _y then r := 1 else r := 0;
  if Top < _x then Inc(r, 2);
  if r <> _r then Inc(_c) else _c := 0;
  if _c > 5 then Beep;
  _x := Left;
  _y := Top;
  _r := r;
end;
also geht das auch so auch nicht :wall:

Super himitsu :hello:

ich habe vorher Deinen Beitrag nicht gesehen.

Offensichtlich denkst Du etwas schneller als ich, da Du sogar schon einen Source-Entwurf vorgestellt hast.

Muchacho

Muchacho 9. Okt 2009 14:45

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von himitsu
OK, WM_MOVE geht leider nicht ... das wird nur einmal nach dem Verschieben ausgelöst :wall:

Left und Top ändern sch leider auch erst nach vollendetem Verschieben, aber nicht wärenddessen

also geht das auch so auch nicht :wall:

Ups himitsu,

"währenddessen" ist natürlich ausschlaggebend

Da was wirklich zählt sind nur die "End-Ergebnisse" einer z.B.: links-rechts Bewegung

Muchacho

P.S.: Also muss ich weiter nach einer Lösung suchen

himitsu 9. Okt 2009 15:44

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
vom Prinzip her tüfte es schon so funktionieren ...
du mußt da leider noch an der VCL vorbei die tatsächliche aktuelle Fensterposition ermitteln,
also Left und Top gegen die "wirklichen" Positionen austauschen.

Muchacho 9. Okt 2009 19:54

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Hi :-D

Ich habe mit Hilfe himitsu (Danke!) einen Weg gefunden, mein Problem zu Lösen.

Sobald die Titel Leiste angeklickt wird, wird TTimer.Enbabled = true gestartet
mit einem Interval = 1

und alles andere kann man (in dem OnTimer Ereignis) mit etwas Geschicklichkeit,
während TTimer läuft, auslesen und entsprechend auswerten.

Nach ca. 2 Sekunden wird der TTimer auf Enabled = false gestellt (dafür sorgt dann eine interne Variable) und somit ausgeschaltet.


Allerdings bleibt noch eine alle letzte Frage offen:

Wie kann ich erfahren, dass eine Titel Leiste eines Windows Fenster (fsMDIChild) angeklickt wurde?


Weiß man Antwort auf diese Frage ist dieses Problem gelöst!

Gruß

Muchacho

Sir Rufo 9. Okt 2009 23:04

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Und wenn ich die Titelleiste anfasse und erst nach 2 Sekunden das Fenster schüttel?
Könnte einen Anwender evtl. verwirren.

Unter Win7 kann ich das Fenster mit der Maus solange festhalten wie ich möchte und das Schütteln löst die Reaktion aus.

Im Prinzip ist es doch so, dass die Titelleiste angefasst wird (Mouse-Button-Down) und dann auf spezielle Bewegungen (rechts-links) reagiert wird, bis die Maus-Taste losgelassen wird (Mouse-Button-Up)

Vielleicht sollte man das einfacher global lösen und diese Funktion für das gesamte Betriebssystem bauen, mittels eines Maus-Hooks.

cu

Oliver

Muchacho 9. Okt 2009 23:14

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von Sir Rufo
Und wenn ich die Titelleiste anfasse und erst nach 2 Sekunden das Fenster schüttel?
Oliver

Hi Oliver

Natürlich hast Du Recht !!!

Am Anfang habe ich alle diese Probleme nicht erkannt.

So gesehen, werde ich von dem Projekt ablassen, da es gibt zu wenig (bzw. Keine) Möglichkeiten
dieses Ereignis abzufangen (halten mit der Maus) um anschließend vernünftig zu behandeln.

Im Hinblick auf die Zukunft (Windows 7) ergibt dies sowieso nicht viel Sinn.

Gruß

Muchacho

Sir Rufo 9. Okt 2009 23:28

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Wenn du die Funktion global umsetzt (nur so macht das irgendwie sinn) mit einem Hook, dann sollte das auch reibungslos funktionieren.

Wäre auch ein nettes kleines offenes Projekt, wo diese Titelleisten-Gimmicks von Win7 für ältere Win-Versionen zugänglich gemacht werden.

himitsu 9. Okt 2009 23:29

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Also das Titelleiste anklicken kann man abfangen ... da sendet ja Windows eine Nachricht an das Fenster

und das Problem mit dem Anfassen und erst nach 2, 10, 60 oder wieviel auch immer Sekunden erst schütteln, ist ja schon gelöst ... siehe mein Code ... dem ist es egal wann geschüttelt wird, man muß nur eine gewisse Zeit schütteln

praktisch bei 200ms Timer und mit dem dortigen Wert 5 = 1 Sekunde lang schütteln

das Problem ist nur, daß man nicht ausversehn auf ein normales Verschieben reagiert

Muchacho 9. Okt 2009 23:48

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von Sir Rufo
Wäre auch ein nettes kleines offenes Projekt, wo diese Titelleisten-Gimmicks von Win7 für ältere Win-Versionen zugänglich gemacht werden.

Hi Sir Rufo :-D

Also jetzt weiß ich wirklich nicht was ich sagen sollte.

Einerseits kommt jetzt die Windows 7, anderseits weiß ich,
dass viele Anwender noch viele Jahre mit z.b. Windows XP arbeiten werden.

Natürlich wollte ich das Global lösen.

Also werde ich jetzt mit Spannung dieses Theard
beobachten, und falls jemand an einem kleinem Projekt interessiert sein sollte,
würde ich natürlich gerne mitmachen, da diese Funktion finde ich wirklich geil.

Vielleicht zeigt hier jemand wie kann man das „Schnappen“ eines Fenster abfangen

Gruß

Muchacho

SirThornberry 10. Okt 2009 07:56

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
sollte das ganze nicht auch ohne Timer gehen in dem man wm_moving abfängt und darin auswertet ob eine links/rechts Bewegung stattfindet?

turboPASCAL 10. Okt 2009 10:01

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Oder WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANED ...

Die Werte aufzeichnen und abgleichen.
Zudem könnte man nun noch die positiven und negativen Positionsänderungen
untersuchen und eine ggf. Begrenzung vornehmen.

Davon mal abgesehen, tuh ich mir das nicht an und nutze lieber das
Feature von Win7. ;)

alzaimar 10. Okt 2009 10:06

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Ich stell mir dieses Feature gerade an meinem Laptop vor. So ganz ohne Maus, aber dafür mit Touchpad...

Das ganze Gesture-Rumgehüppe in Ehren, aber wieso nicht einfach in System-Menü: "Alle anderen minimieren"?

Sir Rufo 10. Okt 2009 11:25

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Um das Licht einzuschalten reicht auch ein Schalter, aber schöner ist es doch, wenn es überall dort einen Schalter gibt, wo ich den brauchen könnte. Das nennt man dann Komfort.

Bei einem Laptop mag das vielleicht anders sein, aber es gibt ja nicht nur Laptops.

Zudem ist es ja nicht nur das Schüttel-Feature an was ich so denke.
Zieht man das Fenster an der Titelliste an den linken Rand, dann wird das Fenster auf den halben Bildschirm maximiert. Das Gleiche passiert auf der rechten Seite.

Blöd ist: Bei mehr als einem Monitor funktioniert das nur an den Desktop Rändern. Das könnte man in dem Zug auch gleich verbessern.

cu

Oliver

[edit]Soeben gelernt, die Funktionen heißen Aero Shake und Snap[/edit]

Muchacho 10. Okt 2009 12:24

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von Sir Rufo
Um das Licht einzuschalten reicht auch ein Schalter, aber schöner ist es doch, wenn es überall dort einen Schalter gibt, wo ich den brauchen könnte. Das nennt man dann Komfort.

Jawohl!

Es ist was anderes, wenn in einem Program es eine Funktion gibt’s die man nicht benutzt
und doch was anderes, wenn eine Funktion nicht vorhanden ist.

Es gibt’s Leute die sich an solchen Kleinigkeiten begeistern, wie ich z.B.

Zitat:

Zitat von Sir Rufo
Zudem ist es ja nicht nur das Schüttel-Feature an was ich so denke.
Zieht man das Fenster an der Titelliste an den linken Rand, dann wird das Fenster auf den halben Bildschirm maximiert. Das Gleiche passiert auf der rechten Seite.

Das könnte man auch… quasi mitentwickeln, weil dies ist auch nur geil


Gruß

Muchacho

Muchacho 10. Okt 2009 12:43

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Zitat:

Zitat von SirThornberry
sollte das ganze nicht auch ohne Timer gehen in dem man wm_moving abfängt und darin auswertet ob eine links/rechts Bewegung stattfindet?

Ausschlaggebend hier muss die Zeitspanne sein, da nur so kann man
feststellen ob die Bewegungen schnell oder langsam sind.

Also, wie ich bis jetzt denke, einer TTimer wäre hier sinnvoll.

Darüber hinaus muss man auch die Anzahl solcher Bewegungen auswerten.

Also:

Ab einer Ausgangs Position (bevor die erste „schnelle“ Bewegung kommt)
fängt die Zeitmessung an und die (was äußerst wichtig ist):

Links/Rechts/Oben/Unten-Auswertung.

Dieses Teil würde ich gerne programmieren:

Auswertung und Beeinflussung der anderen offenen Fenster
(egal ob minimiert oder maximiert).

Ich muss allerdings diese TForm.Top- Werte aus einer anderen Routine bekommen.

Ich hoffe, dass irgend jemand eben diese andere Routine (z.B. mit Hilfe von Hoot)
programmieren kann oder zumindest die alles entscheidende Tipps gibt.


Gruß

Muchacho

Bambuti2000 21. Okt 2009 08:29

Re: Schüttel-Funktion / Fenster hin und her schütteln /Windo
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi allerseits.
Ich finde die Idee recht gut hab mich mal an was ran gewagt. Ist vielleicht noch nicht ganz rund, gerade mit den Schüttel-Variablen, aber sieht meiner Meinung schon mal so aus als ob es in die richtige Richtung gehen könnte.
Ich hab mal einen Auszug meines Quellcodes und im Anhang die Exe:

Delphi-Quellcode:
unit MainForm;

interface

uses
  Windows, Messages, Classes, Graphics, Forms;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    r, _r, Ticker, OldXPos, OldYPos: Integer;
    sTime: Int64;
    procedure DrawCanvas(Text: String);
    procedure CheckIfShaking(xPos, yPos: Integer; StartTime: Int64);
    procedure WMWindowPosChanging(var Message: TWMWINDOWPOSCHANGING);message WM_WINDOWPOSCHANGING;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{*** Das Auge isst mit ***}
procedure TForm1.DrawCanvas(Text: String);
var tWidth, tHeight: Integer;
begin
  with Canvas do
  begin
    tWidth:=TextWidth(Text);
    tHeight:=TextHeight(Text);
    Font.Style:=[fsBold];
    Brush.Color:=clWhite;
    TextOut((Width div 2)-(tWidth div 2), (Height div 3), Text);
    Brush.Color:=clRed;
    FrameRect(Rect((Width div 2)-(tWidth div 2)-2, (Height div 3)-2, (Width div 2)+(tWidth div 2)+2, (Height div 2)-5));
    FrameRect(Rect((Width div 2)-(tWidth div 2)-1, (Height div 3)-1, (Width div 2)+(tWidth div 2)+1, (Height div 2)-6));
  end;
end;

procedure TForm1.CheckIfShaking(xPos, yPos: Integer; StartTime: Int64);
begin
  if (sTime < (StartTime + 2000)) then
  begin
    if xPos < OldXPos then r := 1 else r := 0;
    if yPos < OldYPos then Inc(r, 2);
    if r <> _r then Inc(Ticker) else Ticker := 0;
  end
  else
  begin
    sTime := StartTime;
    Ticker:=0;
  end;
  if Ticker > 2 then DrawCanvas(' !!! SHAKIN'' !!! ');
  _r := r;
  OldXPos:=xPos;
  OldYPos:=yPos;
end;

Procedure TForm1.WMWindowPosChanging(Var Message: TWMWINDOWPOSCHANGING);
Var
  MoniRect, DistRect: TRect;
Begin
  { Abmessungen des Monitors, auf dem sich das Fenster befindet }
  MoniRect := Screen.Monitors[Monitor.MonitorNum].WorkareaRect;

  With Message Do
    With DistRect Do
    Begin
      CheckIfShaking(WindowPos.X, WindowPos.Y, GetTickCount);

  {*** Ab hier wird der SnapEffect bearbeitet (ist für den Schütteleffekt nicht notwendig, nur ein AddOn)***}
      { Abweichungen vom Monitorrand }
      Top   := WindowPos.Y - MoniRect.Top;
      Bottom := WindowPos.Y + Height - MoniRect.Bottom;
      Left  := WindowPos.X - MoniRect.Left;
      Right := WindowPos.X + Width - MoniRect.Right;

      { Obere Fensterkante } 
      If (Top <= SnapBuffer) And
         (Top >= -SnapBuffer) Then
        WindowPos.Y := MoniRect.Top
      { Untere Fensterkante } 
      Else If (Bottom <= SnapBuffer) And
              (Bottom >= -SnapBuffer) Then
        WindowPos.Y := MoniRect.Bottom - Height;
      { Linke Fensterkante } 
      If (Left <= SnapBuffer) And
         (Left >= -SnapBuffer) Then
        WindowPos.X := MoniRect.Left
      { Rechte Fensterkante } 
      Else If (Right <= SnapBuffer) And
              (Right >= -SnapBuffer) Then
        WindowPos.X := MoniRect.Right - Width;
    End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
  sTime:=GetTickCount;
  OldXPos:=Left;
  OldYPos:=Top;
end;

end.
Ich hoffe das regt ein wenig an.

Gruß
Bambuti2000


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