WinFX-Lib (inkl. "click-through" Window) - [Windows only]

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

WinFX-Lib (inkl. "click-through" Window) - [Windows only]

Beitrag von PureLust »

Hallo zusammen,

inspiriert von diesem Thread, in dem Xaby nach einem nicht anklickbaren "Overlay-Fenster" fragte, hab ich mich mal drangesetzt und mal ausbaldowert ob und wie soetwas eventuell zu realisieren ist.
Und ... isch hab's doch tatsächlich hinbekommen.
Bild
Bei dem "nicht anklickbaren Fenster" handelt es sich also um ein Fenster im sogenannten "layered & transparency Mode", das zwar auf dem Desktop angezeigt wird, jedoch sämtliche Events zu dem dahinter liegenden Fenster durchlässt.
Sowas hätte ich zwar schon ein paar mal gut gebrauchen können, wusste bisher aber garnicht, dass sowas überhaupt geht :mrgreen: (hab hier auch noch nie eine Umsetzung davon gesehen).

Nunja ... habs wie gesagt hinbekommen und das ganze dann noch zusammen mit ein paar anderen Fenster-Spezialitäten (die ich ab und zu mal brauche) in eine Include gepackt und 'ne kleine Lib draus gemacht.
Bis auf den "click-through" Modus ist nicht wirklich neues dabei (nur bekannte Spielereien wie "Hide from TaskBar" und "Window-Transparency"), aber halt Dinge, die man ab und zu braucht und nach denen halt hier auch immer mal wieder (meist von PB-Neulingen) gefragt wird.

Ich hab mal 3 Files auf meinen WebSpace hochgeladen:
- die eigentliche Lib (als .pbi umgesetzt - Doku ist im Source)
- ein ausführbares Demo-Programm um sich mal schnell die Auswirkungen der Funktionen anschauen zu können.
- sowie den Source des Demo-Programms.
- alles zusammen gibt's (dank Thomas :D ) nun auch komplett als ZIP.
Bild
Im Demo-Programm (Bild oben) kann man z.B. sehr schön sehen, dass man das Browserfenster im Hintergrund DURCH das darüberliegende Fenster bedienen kann (nachdem man den "Click-Through"-Modus aktiviert hat).

Eine nähere Beschreibung des ganzen spare ich mir jetzt mal hier, da alles Nötige eigentlich im Source zu finden sein sollte.
Daher hier nur mal eine kleine Übersicht:
[color=#0000FF]WinFX_ClickThrough(WinNr, State = #True)[/color] hat geschrieben:turns the window into "click-through" Mode
In the "click-through" Mode all Mouse-Events (mouse-movement, clicks, hoover, ...) will go right through the Window to the window underneath.
That means, that the window will not receive any mouse-events from now on.
So keep that in mind, when you turn a window in "click-through" Mode and include a facility to close the window and/or react on userinput, rather than by Window-Events.
Note: For this effect, the window will be turned into "layered Mode".
For more details and limitations on that, see "additional Infos" in the "File description Header" above.
[color=#0000FF]WinFX_HideFromTaskBar(WinNr, State = #True, AutoUnHide = #True)[/color] hat geschrieben:Hides a window from the Taskbar, or brings it back on.
[color=#0000FF]WinFX_Transparency(WinNr, Level, SkinningColor = #WinFX_NoSkinning)[/color] hat geschrieben:Turns on the transparency effect for a window and sets its opacity to the given "Level".
If you set the "SkinningColor", this Color will be used to set an AlphaKey on that window, so it will be transparent on all Pixels which will have the given Color.
Note: For this effect, the window will be turned into "layered Mode".
For more details and limitations on that, see "additional Infos" in the "File description Header" above.
[color=#0000FF]WinFX_TurnOffLayer(WinNr)[/color] hat geschrieben:Turns off the "layered Mode" of the window and switches it back to "normal" mode.
This turns off any WinFX-Effect that will need the window to be in "layered Mode".
The following functions are affected by this: WinFX_ClickThrough() & WinFX_Transparency()
Note: For more informations about the "layered-Mode", see "additional Infos" in the "File description Header" above.
Wie man sieht - im Grunde also nicht wirklich viel Neues (bis auf den "Click-Through"-Effekt), aber vielleicht kann der eine oder andere von Euch das ja mal gebrauchen. ;)

Greetz and have fun, PL.

[Edit]: Link zum Zip-Archiv hinzugefügt.
[Edit2]: Neue Version online -> Window-Skinning Option bei WinFX_Transparency() hinzugefügt und Kommentare oben entsprechend angepasst.
Zuletzt geändert von PureLust am 06.10.2010 18:17, insgesamt 2-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von Rings »

Klasse, funktioniert hier auffem XP32 perfekt. :allright:
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von Kiffi »

Rings hat geschrieben:funktioniert hier auffem XP32 perfekt.
dito hier auf Vista Business SP2

Auch von mit ein dickes :allright:

Danke & Grüße ... Kiffi
Hygge
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von PureLust »

Uhiiii ... Lob von zwei Koryphäen wie Euch ... danköööö !!!
Bild
Und auch Dank für's testen. :allright:

Grüße, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von ts-soft »

:allright: funktioniert gut, wenn ich im moment auch nicht wüßte wozu ich es nutzen könnte.

Aber, von mir wie immer erstmal Kritik :mrgreen:
Es wäre schöner, wenn Du die 3 Dateien in ein Zip packst um diverse Probleme zu vermeiden.
1. Nachfrage ob Exe ausgeführt werden darf fällt weg (je nach System und Software)
2. Das Anzeigen des Sources im Browser fällt weg (wenn man nicht sofort einen Rechtsclick nutzt)

Unter Tipps & Tricks wäre es eigentlich besser aufgehoben.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von cxAlex »

Gefällt auch mir recht gut, auch wenn ich eher weniger GUI's programmiere :allright:

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von PureLust »

@Thomas und Alex: Dank auch an Euch. :allright:
ts-soft hat geschrieben: :allright: funktioniert gut, wenn ich im moment auch nicht wüßte wozu ich es nutzen könnte.
Also ich hätte genau dafür vor kurzem eine Verwendung gehabt:

Für meinen Onkel (der leider eine sehr starke Sehschwäche hat), habe ich eine Desktop-Lupe programmiert.
Nun wollte ich das so machen, dass die Lupe immer unter der Maus mitgeführt wird (die Maus also mitten in der Lupe).
Um nun durch die Lupe durchklicken zu können habe ich Regions benutzt (also unter der Maus ein Loch in die Lupe gestanzt).
Nun gab es zum einen eine kleinere Lupe, die immer mit der Maus mitgeführt wurde, als auch auch eine Vollbild-Lupe, wobei der gesamte Bildschirm als Lupe diente. Hierbei musste ich die Regions also bei jedem Mousemove wieder verändern (oder besser, freigeben und neu erstellen, da einfach "nur verändern" ja leider nicht geht).
1. geht das zum Teil ziemlich auf die Performance, und
2. geht das nicht immer schnell genug, so dass evtl. ein Klick erfolgte, bevor die Regions angepasst waren - der Klick ging also auf die Lupe statt hindurch.
Das wird nach der Änderung in ein "click-through" Window dann hoffentlich perfekt funktionieren. ;)

Weiterhin habe ich für uns hier in der Firma kürzlich eine App geschrieben, die ein Kamerabild (der Überwachungskamera unseres Haupteingangs) auf jeden Rechner projiziert, sobald jemand klingelt. Zuvor musste halt immer jemand aufstehen und nachsehen wer an der Türe ist.
Wenn nun das Kamerbild aufpoppte, konnte es (je nachdem wo der User gerade mit der Maus war) vorkommen, dass ihm das Kamerabild dazwischen gefunkt hat, den Klick abfing und das Kamerafenster den Fokus bekam.
Nach kurzer Zeit hatte ich das dann allerdings auch schon genau so umgeändert, wie Du's Xaby im oben angesprochenen Thread vorgeschlagen hattest - also der Maus mit dem Fenster einfach aus dem Weg zu gehen.
Aber ... wie Du Dir vielleicht denken kannst ... auch hierfür kann ich das also nun sehr gut gebrauchen. <)

Btw.: Um nun auch die Türe direkt über meine Anwendung öffnen zu können (was bei uns per Telefon über die Telefonanlage gemacht werden kann), hatte ich mich auch mal näher mit der TAPI beschäftigt (auh mann, ... was für ein Gewürge).
Hierbei ist dann also noch so nebenbei eine kleine TAPI-Lib entstanden, die ich auch mal hier reinstellen könnte, falls jemand Verwendung dafür hätte (ich meine mich erinnern zu können, dass kürzlich jemand Fragen bzgl. TAPI hatte).

Auch plane ich, bei einer meiner nächsten Anwendungen (Neuprogrammierung unseres firmeninternen Messangers) die Fenster der aufpoppenden Messages mit der "click-through"-Funktion auszustatten.

Wie Du siehst ... zumindest ich hab schon mal massig Verwendung dafür. ;)
ts-soft hat geschrieben:Aber, von mir wie immer erstmal Kritik :mrgreen:
Es wäre schöner, wenn Du die 3 Dateien in ein Zip packst um diverse Probleme zu vermeiden.
1. Nachfrage ob Exe ausgeführt werden darf fällt weg (je nach System und Software)
2. Das Anzeigen des Sources im Browser fällt weg (wenn man nicht sofort einen Rechtsclick nutzt)
Konstruktive Kritik ist doch immer sehr willkommen !!! :allright:
Und wenn's auch noch so leicht umzusetzende ist erst recht. :mrgreen: (Zip ist auch schon druff)

ThanX nochmals .. und schöne Grüße, PL.
Zuletzt geändert von PureLust am 06.10.2010 00:34, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von Kiffi »

man könnte auch ein stylisches Fenster oben am Monitorrand erscheinen
lassen, welches Infos über CPU-Auslastung, RAM-Belegung, etc. anzeigt.
Nach dem Motto: Wichtige Infos immer im Blick aber nie im Weg.

Grüße ... Kiffi
Hygge
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von PureLust »

Kiffi hat geschrieben:man könnte auch ein stylisches Fenster oben am Monitorrand erscheinen
lassen, welches Infos über CPU-Auslastung, RAM-Belegung, etc. anzeigt.
Nach dem Motto: Wichtige Infos immer im Blick aber nie im Weg.
Auch 'ne geile Idee !!! Bild
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: WinFX-Lib (inkl. "click-through" Window) - [Windows only

Beitrag von bobobo »

schon genial .. kann man aber noch ne winzigkeit erweitern ..
dahingehend, dass ein geskinntes Fenster transparent dargestellt werden kann

öömm SetLayeredWindowAttributes_(...) kann man
durchaus auch parameterverknotet (waW) bestücken, so das nicht nur Transparenz
sondern auch ein Skinning möglich wird (man erhält so geskinnte transparente Fenster)
(geskinnte sollten keine Titelleiste haben)


level=transparenzlevel
color=Alphafarbe (die wird dann eben nicht dargestellt)


aus ;SetLayeredWindowAttributes_(WindowID, #Null, 255*(100-level)/100, #LWA_ALPHA)
und ;SetLayeredWindowAttributes_(WindowID,color.l,0,1)
wird SetLayeredWindowAttributes_(WindowID,#Null|color.l,0|255*(100-level)/100,1|#LWA_ALPHA)

eine Art Beispiel

Code: Alles auswählen

CreateImage(0,300,300)
StartDrawing(ImageOutput(0))
  Box(0,0,300,300,#Cyan)
  DrawingMode(#PB_2DDrawing_Gradient)
  BackColor(RGB(152, 226, 253))
  FrontColor(RGB(2, 59, 79))
  CircularGradient(70, 70, 200)
  Circle(150,150,140,#Red)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10,10,"ALT-F4 zum Beenden")
StopDrawing()
OpenWindow(0,0,0,300,300,"Fenster",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
hBrush.l = CreatePatternBrush_(ImageID(0))
SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hBrush.l)
InvalidateRect_(WindowID(0), #Null, #True)
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)
ll=255*(100-20)/100 ; 80 ist der TransparenzLevel in Prozent (Transparenz geht von 0 bis 255)
Debug ll
SetLayeredWindowAttributes_(WindowID(0),#Cyan|#Null,0|ll,1|#LWA_ALPHA)
StickyWindow(0,1)
HideWindow(0,0) ;sichtbar machen nach der skinnerei
Repeat
  event=WaitWindowEvent()
  Select event
  Case #WM_LBUTTONDOWN
    SendMessage_(WindowID(0),#WM_NCLBUTTONDOWN, #HTCAPTION,0) ;danilo, linke maus schiebt fenster
  EndSelect
Until event=#PB_Event_CloseWindow
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten