Fokus auf eigenes Fenster verhindern

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Fokus auf eigenes Fenster verhindern

Beitrag von KeyKon »

Ich weiß mal wieder nicht weiter und konnte bisher keine Lösung für mein Problem finden.

Das Szenario ist ein Hilfsprogamm welches ich gerade schreibe, dort kann man diverse Funktionen aktivieren die dann wiederum das Hauptprogramm (nicht von mir) beeinflussen.
Gelöst ist das ganze recht schlicht als Overlay über dem Hauptprogramm (transparentes Sticky Fenster mit ImageGadget), ich registriere einfach die Position der Maus beim Klick was dann die entsprechende Aktion auslöst.
Dummerweise löst ein Klick auf ein Fenster aber auch den Fokuswechsel auf dieses aus, das heißt das Hauptprogamm verliert den Fokus was dort dann aber ungewünschte Effekte auslöst.


Also lange Rede, einfache Frage:
Kann ich den Klick registrieren und verhindern dass mein Fenster den Fokus erhält? (Windows 7)


LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Austria

Re: Fokus auf eigenes Fenster verhindern

Beitrag von chi »

Kannst du damit vielleicht was anfangen?!

Code: Alles auswählen

Enumeration
  #Window
  #Tool
EndEnumeration

Procedure WindowCallback(WindowID, Message, WParam, LParam)
  Result = #PB_ProcessPureBasicEvents
  Select Message

    Case #WM_NCACTIVATE
      SetActiveWindow(#Window)
      If wParam = #False
        Result = #True
      EndIf

    Case #WM_MOUSEACTIVATE
      Result = #MA_NOACTIVATE
      
  EndSelect
  ProcedureReturn Result
EndProcedure

OpenWindow(#Window, 0, 0, 800, 500, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(0,10,10,100,40,"Click Me")

OpenWindow(#Tool, 0, 0, 320, 200, "",#PB_Window_Tool|#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StickyWindow(#Tool,1)
SetWindowCallback(@WindowCallback(), #Tool)
ButtonGadget(1,10,10,100,40,"Click Me")

SetActiveWindow(#Window)

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Fokus auf eigenes Fenster verhindern

Beitrag von KeyKon »

Nunja, ich verstehe den Code vll nicht ganz, aber er schanzt ja nur den Fokus direkt wieder zurück?
Er hat zumindest nicht den gewünschten Effekt (Habe das fremde Programm per Handle angesprochen).
Hier ein kleines Beispiel was mein Problem zeigt:

Code: Alles auswählen

OpenWindow(0,0,0,1000,600,"Main",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_DeactivateWindow
      Debug "Fokus verloren"
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Help",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

CreateImage(0,200,200,24,#Red)

ImageGadget(0,0,0,200,200,ImageID(0))

StickyWindow(0,1)

Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        Debug "Klick"
      EndIf
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Programm Help und Programm Main zu starten, Ziel ist es wenn ich jetzt auf das Help-Fenster klicke soll beim Programm Main nicht mehr "Fokus verloren" auftauchen weil es diesen dauerhaft behält...
Auf Programm Main habe ich wie gesagt keinen Einfluss!

LG KeyKon
(\/) (°,,,°) (\/)
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Fokus auf eigenes Fenster verhindern

Beitrag von Derren »

Vielleicht so. Nicht sehr elegant, aber zweckmäßig

Code: Alles auswählen

Define cursor.point
Define windowX, windowY, windowWidth, windowHeight

OpenWindow(0,0,0,200,200,"Help",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

WindowX = WindowX(0)
WindowY = WindowY(0)

WindowWidth = WindowWidth(0)
WindowHeight = WindowHeight(0)

CreateImage(0,200,200,24,#Red)

ImageGadget(0,0,0,200,200,ImageID(0))

StickyWindow(0,1)


DisableWindow(0,1)


Repeat
	Delay(1)
	
	GetCursorPos_(cursor)
	
	If cursor\x > WindowX And cursor\x < (WindowX+WindowWidth)
		If cursor\y > WindowY And cursor\y < (WindowY+WindowHeight)
			Debug "onWindow"
		EndIf 
	EndIf 
ForEver
Hier müsstest du halt deine eigenen Gadget "Boundaries" definieren, ein bißchen so wie bei einer custom GUI mit Sprites oder so.
Das Mausklick event musstdu natürlich auch nocht abfragen. Sorry bin nicht so der API-crack.

Der Wait-Cursor nervt, aber mit WaitWindowEvent() wird die komplette Schleife angehalten, wegen dem DisableWindow()

Vielleicht hilfts.
Signatur und so
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Fokus auf eigenes Fenster verhindern

Beitrag von KeyKon »

Wäre zwar eine schöne Idee, wenn auch sehr unsauber, geht aber nicht.
Dein Beispiel funktioniert nämlich nur weil du die Events nicht abarbeitest, was irgendwann unweigerlich dazu führt dass Windows sich um das Programm "kümmert"^^

Mit einem WaitWindowEvent(50) (statt dem Delay()) buggt zwar nix mehr, aber dann nimmt sogar ein deaktiviertes Fenster den Fokus weg.

Keiner anderen Ideen mehr :( Geht das vll einfach nicht?

LG KeyKon
(\/) (°,,,°) (\/)
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Fokus auf eigenes Fenster verhindern

Beitrag von Derren »

nvm. WindowEvent() geht auch nicht. Sieht alleine gut aus, aber der Focus geht trotzdem verloren
Signatur und so
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Fokus auf eigenes Fenster verhindern

Beitrag von TroaX »

Die Window-API von Windows sieht so etwas nicht vor. Sobald du auf ein Fenster klickst, das sichtbar bzw. vorhanden ist, erhält es automatisch den Fokus. Du kannst den Fokus nur noch dem Ursprungsfenster zurückwerfen. Aber das dein Fenster keinen Fokus erhält bzw. dem Programm Main den Fokus nicht nimmt, lässt sich nicht beeinflussen. Zumindest ist mir kein Weg bekannt.

Du müsstest also direkt an den RAM des Mainprogramms und den Fokus sowie die genaue Position ermitteln und dann diesen Fokus und die Position setzen. Dann würde der Fokusverlust nicht auffallen. Dafür müsstest du dein Programm aber in einen anderen Ring befördern. Im User-Mode dürfen die Programme nur über eine API im Ring 0 untereinander im RAM rumfummeln. Also wenn gibt es dafür Befehle in der API (was mir nicht bekannt ist) oder das Programm muss auf Ring 0.

Oder du zeichnest das Overlay/OSD direkt per GDI bzw. DX und blittest das Ding in den Backbuffer. Mit dieser Sache habe ich aber keine Erfahrungen bisher gemacht. Ich weiß nur, das es geht.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Fokus auf eigenes Fenster verhindern

Beitrag von KeyKon »

Schade, so etwas hab ich schon befürchtet.
Den Aufwand mit Speichermanipulation werd ich mir sicher nicht machen, ist ja auch nicht grad die feine Art^^

Ich werde dann wohl die Interaktion komplett mit Hotkeys realisieren und das Overlay nur als Anzeige nutzen.

Trotzdem Danke für eure Beiträge :)

LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Fokus auf eigenes Fenster verhindern

Beitrag von Bisonte »

Und mal ganz banal gefragt : Hast du es schon mit SetParent_() ausprobiert ? Sozusagen : Dein Fenster "Shanghait" das andere ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fokus auf eigenes Fenster verhindern

Beitrag von Kiffi »

@KeyKon: Du könntest kontinuierlich prüfen, welches Control den Fokus besitzt (geht IMO hiermit).
Wenn dann Dein Programm den Fokus bekommt, setzt Du ihn sofort wieder auf das zuletzt gemerkte Control zurück.

Grüße ... Kiffi
a²+b²=mc²
Antworten