Seite 1 von 1

Find Fokus und Mutex Frage.

Verfasst: 01.01.2018 18:56
von tft
Hallo,

ich habe ein Beispiel von RSBasic etwas umgeändert um vom Main Programm aus den Ermittelten
Fenster Name des Fenster das gerade den Fokus hat auszugeben. Damit es wegen des Hook kein Zugriff Problem
gibt habe ich einen Mutex verwendet. Es funktioniert auch ... aber ich bin mir nicht sicher ob das so reicht.

Code: Alles auswählen

EnableExplicit

Define HWINEVENTHOOK
#EVENT_SYSTEM_FOREGROUND = $3

Global WindowAsFokus.s
Global WindowAsFokusOld.s
Global Mutex = CreateMutex()
Global Event,Quit

Procedure WinEventProc(hWinEventHook, event, hwnd, idObject, idChild, idEventThread, dwmsEventTime)
  Protected Title$
  
  Select event
    Case #EVENT_SYSTEM_FOREGROUND
      Title$ = Space(250)
      GetWindowText_(hwnd, @Title$, Len(Title$))
      
      LockMutex(Mutex)
        WindowAsFokus.s = Title$
      UnlockMutex(Mutex)
      
  EndSelect
  
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StickyWindow(0,#True)
  
  HWINEVENTHOOK = SetWinEventHook_(#EVENT_SYSTEM_FOREGROUND, #EVENT_SYSTEM_FOREGROUND, 0, @WinEventProc(), 0, 0, 0)
  
  Repeat
    
    LockMutex(Mutex)
    If WindowAsFokus.s <> WindowAsFokusOld.s
      WindowAsFokusOld.s = WindowAsFokus.s
      SetWindowTitle(0,WindowAsFokus.s)
    EndIf
    UnlockMutex(Mutex)
    
    Event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        UnhookWinEvent_(HWINEVENTHOOK)
        Quit = 1
    EndSelect
    Delay(10)
  Until Quit
  
EndIf

End

Ausserdem weis ich nicht wo der Fenster Handler hinkommt.
HWINEVENTHOOK = SetWinEventHook_(#EVENT_SYSTEM_FOREGROUND, #EVENT_SYSTEM_FOREGROUND, >Handler ????<, @WinEventProc(), 0, 0, 0)

Gruss TFT

Re: Find Fokus und Mutex Frage.

Verfasst: 18.01.2018 22:16
von Fluid Byte
Warum benutzt du einen Mutex? Warum SetWinEventHook_() und nicht GetForegroundWindow_() mit Schleife und Delay
Ausserdem weis ich nicht wo der Fenster Handler hinkommt.
Was für ein Fenster Händler?

Re: Find Fokus und Mutex Frage.

Verfasst: 26.01.2018 23:30
von tft
Hallo,

das hat mehrere Gründe, der bestechenste ist das seit W10 das handling von Fenstern und den entsprechenden Events, diese nicht mehr jedem Thread zur Verfügung stehen. Ein Fenster ohne Focus erhält nur noch PostEvents. Daher müssen einige dinge jetzt über CallBacks gelöst werden. Das widerum sind aus meiner Sicht Programmteile die wie Threads behandelt werden müssen. Da diese ja jederzeit dazwischen funken können. Bei einem Processor ist das unproblematisch. Bei mehreren kann es dabei zu Speicher Zugriffs Verletzungen kommen. Daher der Mutex.
Sofiel zu meiner Denkungsweise zu diesem Thema. Wenn diese Fehlerhaft ist. bin ich für Korekturen offen. Man lernt nie aus.

Grusas TFT

Re: Find Fokus und Mutex Frage.

Verfasst: 28.01.2018 22:40
von Fluid Byte
tft hat geschrieben:das hat mehrere Gründe, der bestechenste ist das seit W10 das handling von Fenstern und den entsprechenden Events, diese nicht mehr jedem Thread zur Verfügung stehen. Ein Fenster ohne Focus erhält nur noch PostEvents.
1.) Du verwendest keine Threads
2.) Quelle bitte
tft hat geschrieben:Daher müssen einige dinge jetzt über CallBacks gelöst werden.
Das müssen sie? Warum? Sagt wer? Microsoft?
tft hat geschrieben:Das widerum sind aus meiner Sicht Programmteile die wie Threads behandelt werden müssen.
Ich behaupte nicht dass das falsch ist nur ohne Beleg ist es nichts weiter als persönliche Spekulation.
tft hat geschrieben:Da diese ja jederzeit dazwischen funken können. Bei einem Processor ist das unproblematisch. Bei mehreren kann es dabei zu Speicher Zugriffs Verletzungen kommen. Daher der Mutex. Sofiel zu meiner Denkungsweise zu diesem Thema. Wenn diese Fehlerhaft ist. bin ich für Korekturen offen. Man lernt nie aus.
Wozu du einen Mutex benötigst bleibt mir weiterhin ein Rätsel.
LockMutex(Mutex) hat geschrieben:After this function returns, it is assured that this thread is the only one with a locked state on the mutex. The thread can now freely access the shared resource that is protected by this mutex, as it is the only one with exclusive access to the mutex.
Du benutzt keine Threads oder greifst auf geteilte Ressourcen zu.

Was ist hieran auszusetzen?

Code: Alles auswählen

OpenWindow(0,0,0,400,100,"",#PB_Window_SystemMenu | 1)
TextGadget(0,10,10,380,80,"blah",#WS_BORDER|#SS_CENTERIMAGE|#SS_CENTER)
SetGadgetColor(0,#PB_Gadget_BackColor,#White)
SetGadgetFont(0,LoadFont(0,"Arial",10,#PB_Font_Bold))
StickyWindow(0,1)

winName$ = Space(256)

Repeat 
   EventID = WindowEvent() 
   
   hwndFocus = GetForegroundWindow_()
   
   If hwndFocus = WindowID(0)
   	SetGadgetText(0,"self")
   Else
	   GetWindowText_(hwndFocus,winName$,256)
	   SetGadgetText(0,winName$)
	EndIf

	Delay(10) 
Until EventID = #PB_Event_CloseWindow

Re: Find Fokus und Mutex Frage.

Verfasst: 30.01.2018 01:04
von tft
Hallo,

an dem Code den du gepostet hast ist nichts auszusetzen. Der ist OK wie er ist. Aber nicht das was ich brauche.
Es geht darum von einem Anderen Prozess aus darauf zuzugreifen. Und dein Code .... den habe ich in der Vorm auch schon
probiert, dabei kommen gelegentlich Speicher Verletzungsfehler. Das hier ist auch eher eine Prinzip frage. Den der Code
den ich gepostet habe funktioniert so ja. Es kann sein das ich die Grunsatz Voraussetzungen nicht gut ausformuliert habe.

Gruss TFT

Re: Find Fokus und Mutex Frage.

Verfasst: 30.01.2018 21:22
von Fluid Byte
tft hat geschrieben:an dem Code den du gepostet hast ist nichts auszusetzen. Der ist OK wie er ist. Aber nicht das was ich brauche.
Aha ....... und was brauchst du?
tft hat geschrieben:Es geht darum von einem Anderen Prozess aus darauf zuzugreifen.
Welcher andere Prozess? Darauf? Was darauf? Auf was zuzugreifen?
tft hat geschrieben:Und dein Code .... den habe ich in der Vorm auch schon probiert, dabei kommen gelegentlich Speicher Verletzungsfehler.
Alles klar, das heißt im Klartext dein Code war Schrott und du schlussfolgerst daraus das dies für meinen genauso gilt ohne ihn ausprobiert zu haben. Verstanden.

Können wir deinen Code mal sehen oder sind das wieder 6 Millionen Zeilen die du unmöglich kürzen kannst?
tft hat geschrieben:Das hier ist auch eher eine Prinzip frage.
Nein, ist es nicht.
tft hat geschrieben:Den der Code den ich gepostet habe funktioniert so ja.
Starkes Argument, du solltest bei Ubisoft anfangen.
tft hat geschrieben:Es kann sein das ich die Grunsatz Voraussetzungen nicht gut ausformuliert habe.
Du hast gar nichts formuliert. Also, was sind die Grundsatz-Voraussetzungen? Bitte klar und deutlich, kein Geschwafel ansonsten bin ich raus.

Re: Find Fokus und Mutex Frage.

Verfasst: 31.01.2018 11:08
von NicTheQuick
So, jetzt kommt mal alle wieder runter hier, sonst gibt's Verwarnungen. Es gibt keinen Grund sich hier irgendwo angegriffen zu fühlen.