AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Freeware: Multimonitor Software (QuickSwitch)
Thema durchsuchen
Ansicht
Themen-Optionen

Freeware: Multimonitor Software (QuickSwitch)

Ein Thema von stoxx · begonnen am 13. Aug 2007 · letzter Beitrag vom 4. Okt 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von stoxx
stoxx
Registriert seit: 13. Aug 2003
Betreibt Ihr mehrere Monitore an einem Rechner? Dann kennt Ihr sicher das lästige Vorgehen, wenn Ihr ein maximiertes Fenster auf einen anderen Monitor verschieben wollt. Man muss das Fenster erst auf normale Größe bringen, dann auf den anderen Bildschirm verschieben und anschließend wieder maximieren.
Mit QuickSwitch verschiebst Du das maximierte Fenster mit einer einfachen Mausbewegung auf den gewünschten Monitor. Man klickt in die Titelleiste, bewegt die Maus in die gewünschte Richtung des neuen Monitors und nach kurzer Bewegung wird das Fenster auf dem anderen Monitor angezeigt.
Das Fenster hat man aber nun immer noch im „Griff“. Wenn Du die Maus weiterbewegst (nach oben, unten, links oder rechts), dann wird das Fenster wiederum weiter bewegt.
.. Solange bis der gewünschte Monitor erreicht ist.

Weiterhin kann man mit der Funktion „Quickmove“ beliebige Fenster, egal ob maximiert oder normal, per Schnell-Auswahl auf einen anderen Monitor plazieren
Dazu klickt man mit der rechten Maustaste auf die Titelleiste des Fensters. Es werden nun alle Monitore in einem Auswahlfenster angezeigt.

Aber … Man kann das Fenster nicht nur verschieben, sondern auch gleich maximiert auf dem gewählten Monitor darstellen
Je nach Maustaste, die man beim Auswählen drückt, wird das Fenster entweder nur verschoben oder gleich maximiert.
Ob man dazu die mittlere, linke oder rechte Maustaste verwenden möchte, ist in QuickSwitch frei konfigurierbar.

Zitat eines Nutzers:

„Man gewöhnt sich schnell an das Tool.
… letztens hatte ich es nicht an
… und hab verzweifelt versucht den Explorer zu schieben“


-
QuickSwitch hat folgende Funktionalitäten:
------------------------------------------

- Verschieben eines maximierten Fensters auf einen anderen Monitor mit einer einfachen Mausbewegung.
- Unterstützung für beliebig viele Monitore.
- Direkte Platzierung eines Fensters per Auswahl des Monitors in einem kleinen Fenster.


Updates findet man in Zukunft unter www.xtrade.de
(Im Moment ist aber noch keine Seite dafür eingerichtet)

[Update 31.08.2007]
- Bugfix: funktionierte nicht mit Office 2007 Fenstern

[Update 02.09.2007]
- Bugfix: Manchmal wurden einige Monitore nicht erkannt

[Update 26.10.2008]
- QuickSwitch lässt sich wahlweise mit der mittleren oder rechten Maustaste aufrufen
- Aufruf kann unterdrückt werden, wenn Strg gedrückt oder wahlweise nur, wenn Strg betätigt wurde


[Update 04.10.2015]
- QuickSwitch harmoniert nun besser mit der AeroSnap Funktion, die seit Win7 integriert wurde (es kam
gelegentlich zu Hüpfern beim Verschieben maximierter Fenster)

- rechte Maustaste in der Titelleiste führte manchmal dennoch zum Anzeigen des Systemmenüs. -> behoben
- neue Features



neue Features 04.10.2015:


- die Monitorvorschau ermöglicht nun das Platzieren eines Fenster in den jeweilgen Quadranten eines Monitors.
Weiterhin das Platzieren in die linke Hälfte, rechte Hälfte, obere Hälfte und untere Hälfte eines Monitores.
(Abhängig, in welchen Bereich man auf die Vorschau-Monitore klickt)

Screenshotfunktion:
- Beim Klick auf die "DRUCK" Taste, passiert ungefähr das Gleiche wie sonst mit ALT-Druck unter Windows. Zusätzlich
wird aber vom Fenster ein Screenshot erstellt, in PNG umgewandelt. Dieses PNG wird in die Zwischenablage kopiert und
parallel gleich in einen Ordner mit Datum und Zeit abgespeichert ( als PNG )

(neue Version im letzten Post, habe nix gefunden, die Dateianhänge zu verwalten)
Angehängte Dateien
Dateityp: zip quickswitchsetup_355.zip (574,4 KB, 236x aufgerufen)
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.

Geändert von stoxx ( 4. Okt 2015 um 22:38 Uhr) Grund: neue Version
 
hathor
 
#2
  Alt 14. Aug 2007, 06:36
Ich benutze MULTIMON.EXE.
In jedem Window erscheint ein zusätzliches Symbol links vom Minimize, damit kann man das Window von einem zum anderen Monitor verschieben . Voraussetzung: Desktop erweitern anklicken im Eigenschaftsfenster der Grafikkarte.

Beschreibung:
http://www.mediachance.com/free/multimon.htm
Download:
http://www.mediachance.com/free/mmtaskbar21.exe
  Mit Zitat antworten Zitat
Dezipaitor

 
Delphi 7 Professional
 
#3
  Alt 14. Aug 2007, 12:56
Leider verwendet der Autor eine zweite Taskbar mit englischer Uhr - die kann man nicht wegmachen oder auf 24h Zeit einstellen.
Zumindest funktioniert es ohne Administratorrechte.

Normale Programme, die keinen wirklichen Grund haben Adminrechte zu beanspruchen (und ich hab Ahnung, wer was braucht), kommen mir nicht auf meinen PC.
Christian
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#4
  Alt 14. Aug 2007, 21:11
Zitat von hathor:
Ich benutze MULTIMON.EXE.
In jedem Window erscheint ein zusätzliches Symbol links vom Minimize, damit kann man das Window von einem zum anderen Monitor verschieben . Voraussetzung: Desktop erweitern anklicken im Eigenschaftsfenster der Grafikkarte.

jo, jo .. die billige Konkurrenz kenn ich doch schon, was denkst Du, warum ich mein Programm entwickelt habe?
Erstens, wer will denn schon auf dusslige Buttons klicken. Ich nicht, ich brauchte was schnelleres ....
Zweitens funktioniert Dein Multimon nur mit 2 Monitoren.
Drittens, funktioniert es auch mit 4 oder 6 Monitoren, wenn ein paar davon übereinander angeordnet sind?
viertens hat es Probleme, wenn die Monitore nicht fein säuberlich durchnummeriert ist.
Und fünftens war es sau, sau, sau .. aber wirklich sau langsam.
Dann empfehle ich Dir lieber noch die kostenpflichte Software Ultramon... Aber auch das kenne ich, und hat mich nicht zufriedengestellt ....

http://www.realtimesoft.com/ultramon/

Gruß ... stoxx
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#5
  Alt 16. Aug 2007, 13:56
Zitat von Dezipaitor:
Leider verwendet der Autor eine zweite Taskbar mit englischer Uhr - die kann man nicht wegmachen oder auf 24h Zeit einstellen.
Zumindest funktioniert es ohne Administratorrechte.

Normale Programme, die keinen wirklichen Grund haben Adminrechte zu beanspruchen (und ich hab Ahnung, wer was braucht), kommen mir nicht auf meinen PC.
da ging es jetzt aber nicht um mein Programm? Oder?
QuickSwitch braucht nur Adminrechte bei der Installation (wegen dem Autostart Eintrag) ansonsten nix ....
  Mit Zitat antworten Zitat
BenniP

 
Delphi 2007 Professional
 
#6
  Alt 17. Aug 2007, 14:59
Hört sich sehr gut und nützlich an .
Leider verwende ich zur Zeit keine 2 Monitor, werde es verwenden sobald ich wieder einen zweiten habe.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

 
Delphi 10.2 Tokyo Starter
 
#7
  Alt 17. Aug 2007, 18:59
Kleine Frage dazu .. du verwendest Hooks oder?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#8
  Alt 17. Aug 2007, 21:25
Zitat von Zacherl:
Kleine Frage dazu .. du verwendest Hooks oder?
in dieser compilierten Version nicht, nein ... aber ich hab nun mehrere Varianten zur Auswahl
Die zwei Hook Typen, die dafür gut gewesen wären, funktionieren nicht mehr auf Vista.
(WH_JOURNALRECORD und WH_MOUSE_LL)
und der normale WH_MOUSE Hook hat den nachteil, dass man das Mouse Up Event nicht bekommt, wenn man bei gedrückter Maustaste den geklickten Bereich verlässt....
So habe ich mich für die GetAsyncState Polling Methode entschieden


Falls Dich der Quelltext interessiert .. ist ein stinknormaler Timer, ein angeblich etwas resourcenschonender Multimediatimer stürtze leider ab und zu ab ... es waren ihm irgendwie zuviele Stackaufrufe in der Callback Procedure ...
falls Dich die Unit interessiert ... hier der Code ...

Delphi-Quellcode:
unit xMouseHookVistaU;

// Version 1.0

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xSystemTimerU, xClasses, ExtCtrls;




type


//==============================================================================

TMouseHook = class(TObject)
private

  BoolDelphiTimer : Boolean;
  LButtonIsDown : boolean;
  RButtonIsDown : Boolean;
  MButtonIsDown: boolean;
  LastPos : TPoint;


  EMouseDown, EMouseUp : TMouseEvent;
  EMouseMove : TMouseMoveEvent;

  FHookStarted : Boolean;
  FTimer : TSystemTimer;
  FTimerDelphi : TTimer;


  FEventMouseDownMMCaster : TMulticaster;
  FEventMouseUpMMCaster : TMulticaster;
  FEventMouseMoveMMCaster : TMulticaster;

  function GetShift : TShiftState;

  procedure OnTimer(Sender : TObject);
  procedure Set_EventMouseMove(const Value: TMouseMoveEvent);
  procedure Set_EventMouseDown(const Value: TMouseEvent);
  procedure Set_EventMouseUp(const Value: TMouseEvent);
  procedure CastMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  procedure CastMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  procedure CastMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
public

  constructor create;
  destructor destroy; override;
  function Start : Boolean;
  function stop : boolean;
  property Timer : TSystemTimer read FTimer;
  property EventMouseDown : TMouseEvent read EMouseDown write EMouseDown;
  property EventMouseUp : TMouseEvent read EMouseUp write EMouseUp;
  property EventMouseMove : TMouseMoveEvent read EMouseMove write EMouseMove;
  procedure RemoveAllForAnObject(anObject: TObject);

end;

//==============================================================================

implementation

//==============================================================================



//==============================================================================

constructor TMouseHook.create;
begin
 inherited;
 BoolDelphiTimer := true;
 FEventMouseDownMMCaster := TMultiCaster.create(self);
 FEventMouseUpMMCaster := TMultiCaster.create(self);
 FEventMouseMoveMMCaster := TMultiCaster.Create(self);


 FHookStarted := False;

 LButtonIsDown := false;
 RButtonIsDown := false;
 MButtonIsDown := false;

 if BoolDelphiTimer then begin
     FTimerDelphi := TTimer.Create(nil);
     FTimerDelphi.Enabled := false;
     FtimerDelphi.OnTimer := self.OnTimer;
     FTimerDelphi.Interval := 50;

 end else begin

     FTimer := TSystemTimer.Create;
     FTimer.Interval := 10;
     FTimer.OnTimer := self.OnTimer;
 end;


end;

//==============================================================================

destructor TMouseHook.destroy;
begin

  if FHookStarted then self.stop;


  if BoolDelphiTimer then begin
       if Assigned(FTimerDelphi)
    then FTimerDelphi.Free;
  end else begin
    Timer.OnTimer := nil;

  end;

 FEventMouseDownMMCaster.free;
 FEventMouseUpMMCaster.free;
 FEventMouseMoveMMCaster.free;

  inherited;
end;

//==============================================================================

procedure TMouseHook.OnTimer(Sender : TObject);
var
    s : String;
    MouseButton : TMouseButton;

    X, Y : Integer;
    Point : TPoint;


    NewLButtonIsDown, NewRButtonIsDown, NewMButtonIsDown : Boolean;
    i : Integer;


begin
   if not FHookStarted then exit;
    GetCursorPos(Point);

    X := Point.X;
    Y := Point.Y;

    NewLButtonIsDown := false;
    NewRButtonIsDown := false;
    NewMButtonIsDown := false;

        if (GetAsynckeyState(vk_lbutton) <> 0) then begin
         NewLButtonIsDown := True;
        end;


        if (GetAsynckeyState(vk_Rbutton) <> 0) then begin
         NewRButtonIsDown := true;
        end;

        if (GetAsynckeyState(vk_mbutton) <> 0) then begin
         NewMButtonIsDown := true;
        end;


// for i := 0 to 10000 do begin
// if i = 145 then continue;
// if (GetAsynckeyState(i ) <> 0) then begin
// beep;
// end;
// end;

    //==========================================================================

    // Left Button Down
    if NewLButtonIsDown and not LButtonIsDown then begin
        LButtonIsDown := true;
        MouseButton := mbLeft;

        if Assigned(EMouseDown)
           then EMouseDown(self,MouseButton, GetShift,X, Y);
    end; // L Button Down


    // Left Button Up
    if not NewLButtonIsDown and LButtonIsDown then begin
        LButtonIsDown := false;
        MouseButton := mbLeft;

        if Assigned(EMouseUP)
           then EMouseUP(self,MouseButton, GetShift,X, Y);

    end; // L Button Up

    //==========================================================================

    // Right Button Down
    if NewRButtonIsDown and not RButtonIsDown then begin
        RButtonIsDown := true;
        MouseButton := mbRight;

        if Assigned(EMouseDown)
           then EMouseDown(self,MouseButton, GetShift,X, Y);
    end; // R Button Down

    // Right Button Up
    if not NewRButtonIsDown and RButtonIsDown then begin
        RButtonIsDown := false;
        MouseButton := mbRight;

        if Assigned(EMouseUP)
           then EMouseUP(self,MouseButton, GetShift,X, Y);
    end; // R Button Up


    //==========================================================================

        // Middle Button Down
    if NewMButtonIsDown and not MButtonIsDown then begin
        MButtonIsDown := true;
        MouseButton := mbMiddle;

        if Assigned(EMouseDown)
           then EMouseDown(self,MouseButton, GetShift,X, Y);

    end; // R Button Down

    // Middle Button Up
    if not NewMButtonIsDown and MButtonIsDown then begin
        MButtonIsDown := false;
        MouseButton := mbmiddle;

        if Assigned(EMouseUP)
           then EMouseUP(self,MouseButton, GetShift,X, Y);

    end; // R Button Up

    //==========================================================================






// // Mouse Wheel
// if (EventStrut.message = WM_MOUSEWHEEL) then begin
// s := 'Mouse Wheel at X pos ' +
// IntToStr(EventStrut.paramL) + ' and Y pos ' + IntToStr(EventStrut.paramH);
// end; // Mouse Wheel

    //==========================================================================
    // Mouse Move
    if (X <> LastPos.x) or
       (Y <> LastPos.Y) then begin
        if Assigned(EMouseMove)
           then EMouseMove(Self, GetShift,X, Y);
    end; // MouseMove


    LastPos.X := x;
    LastPos.Y := y;


end; // OnTimer (TMouseHook)


//==============================================================================

function TMouseHook.GetShift : TShiftState;
begin
    result := [];
    if self.LButtonIsDown then Include(result,ssleft);
    if self.RButtonIsDown then Include(result,ssright);
    if self.MButtonIsDown then Include(result,ssmiddle);

end; // SetShift (TMouseHook)

//==============================================================================

function TMouseHook.Start : Boolean;
begin
  result := false;

      if FHookStarted then exit;

      if BoolDelphiTimer then begin
          FTimerDelphi.Enabled := true;
          FHookStarted := true;
      end else begin

        FTimer.StartTimer;
        FHookStarted := true;
      end;
      result := true;


end; // Start (TMouseHook)

//==============================================================================
function TMouseHook.stop : boolean;
begin
if BoolDelphiTimer then begin
    FTimerDelphi.Enabled := false;
    FHookStarted := false;
end else begin
    FTimer.StopTimer;
    FHookStarted := False;
end;

end; // stop (TMouseHook)

//==============================================================================
//==============================================================================
//==============================================================================

procedure TMouseHook.Set_EventMouseMove(const Value: TMouseMoveEvent);
begin
if not assigned(Value) then showmessage('Bitte remove benutzen') else
FEventMouseMoveMMCaster.add(TMethod(Value));
end;
//==============================================================================
procedure TMouseHook.Set_EventMouseDown(const Value: TMouseEvent);
begin
if not assigned(Value) then showmessage('Bitte remove benutzen') else
FEventMouseDownMMCaster.add(TMethod(Value));
end;
//==============================================================================
procedure TMouseHook.Set_EventMouseUp(const Value: TMouseEvent);
begin
if not assigned(Value) then showmessage('Bitte remove benutzen') else
FEventMouseUpMMCaster.add(TMethod(Value));
end;
//==============================================================================


//==============================================================================
// entfernt ein Object aus ALLEN Multicastern
//==============================================================================
procedure TMouseHook.RemoveAllForAnObject(anObject: TObject);
begin
  FEventMouseMoveMMCaster.RemoveAllForAnObject(anObject);
  FEventMouseDownMMCaster.RemoveAllForAnObject(anObject);
  FEventMouseUpMMCaster.RemoveAllForAnObject(anObject);

end; // RemoveAllForAnObject

//==============================================================================
procedure TMouseHook.CastMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i : Integer;
    Method : TMouseMoveEvent;
begin
 for i := 0 to FEventMouseMoveMMCaster.count - 1 do begin
    Method := TMouseMoveEvent(FEventMouseMoveMMCaster[i]);
    Method(Self, Shift, X, Y);
 end;
end;


//==============================================================================

procedure TMouseHook.CastMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i : Integer;
    Method : TMouseEvent;
begin
 for i := 0 to FEventMouseDownMMCaster.count - 1 do begin
    Method := TMouseEvent(FEventMouseDownMMCaster[i]);
    Method(Self, Button, Shift, X, Y);
 end;

end; // CastMouseDown

//==============================================================================

procedure TMouseHook.CastMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i : Integer;
    Method : TMouseEvent;
begin
 for i := 0 to FEventMouseUpMMCaster.count - 1 do begin
    Method := TMouseEvent(FEventMouseUpMMCaster[i]);
    Method(Self, Button, Shift, X, Y);
 end;

end; // CastMouseUp





end.
  Mit Zitat antworten Zitat
passsy
 
#9
  Alt 30. Aug 2007, 21:39
also ich bin mit ultramon sehr zufrieden hat gleiche funktion und taskleisten

sehr viele features
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#10
  Alt 31. Aug 2007, 20:15
Zitat von passsy:
also ich bin mit ultramon sehr zufrieden hat gleiche funktion und taskleisten
sehr viele features
es ging mir auch nicht darum, ein Programm, was für glaub ich 39 Dollar angeboten wird zu überbieten, und es dann als freeware auf den Markt zu schleudern. Sondern die Funktionen, die mir nicht gefielen, anders umzusetzen.
Dafür setz ich mich nicht eine Woche meiner mittleriweile sehr kostbaren Zeit hin.
Das Programm ist einfach das, was ich haben wollte, und ich biete Dir nun einfach an, es kostenlos mitzubenutzen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 04:42 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