Seite 1 von 1

[WinAPI] Ist Fenster aktiv? + Ist die Maus über dem Fenster?

Verfasst: 12.06.2018 20:13
von Mijikai
Hänge mal wieder fest :freak:

Wie kann ich zuverlässig feststellen ob mein Fenster noch aktiv ist ?
Wenn es aktiv ist wie kann ich feststellen ob die Maus im Fenster ist ?

Hier mein Versuch mit WM_MOUSELEAVE
bestimmt gibt es besser Lösungen/Möglichkeiten

Mein WindowProc() Code:

Code: Alles auswählen

Procedure.i WindowProc(hwnd.i,message.i,wparam.l,lparam.l)
  With Base
    Select message
      Case #WM_DESTROY
        PostQuitMessage_(#Null)
        ProcedureReturn #Null

      Case #WM_MOUSEMOVE
        \Position\X = GetLoWord(lparam)
        \Position\Y = GetHiWord(lparam)
        ProcedureReturn #Null
        
        
      Case #WM_MOUSELEAVE
        Debug 123 ;< wird nur einmal beim Start aufgerufen!?
     
    EndSelect
    ProcedureReturn DefWindowProc_(hwnd,message,wparam,lparam)
  EndWith
EndProcedure
Für #WM_MOUSELEAVE hab ich das:

Code: Alles auswählen

Procedure.b InitMouseInput()
  Protected Mouse.TRACKMOUSEEVENT
  With Base
    Mouse\cbSize    = SizeOf(TRACKMOUSEEVENT)
    Mouse\dwFlags   = #TME_LEAVE
    Mouse\hwndTrack = \Window\Handle
    ProcedureReturn TrackMouseEvent_(@Mouse)
  EndWith
EndProcedure

Re: [WinAPI] Ist Fenster aktiv? + Ist die Maus über dem Fens

Verfasst: 12.06.2018 20:22
von RSBasic
Ich habe einen eigenen Beispielcode geschrieben, mit dem es klappt:

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Protected TRACKMOUSEEVENT.TRACKMOUSEEVENT
  
  Select uMsg
    Case #WM_MOUSEMOVE
      Debug "Maus innerhalb des Fensters"
      TRACKMOUSEEVENT\cbSize = SizeOf (TRACKMOUSEEVENT)
      TRACKMOUSEEVENT\dwFlags = #TME_LEAVE
      TRACKMOUSEEVENT\hwndTrack = hwnd
      TrackMouseEvent_(TRACKMOUSEEVENT)
    Case #WM_MOUSELEAVE
      Debug "Maus außerhalb des Fensters"
      
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Oder fehlt dir was?

Re: [WinAPI] Ist Fenster aktiv? + Ist die Maus über dem Fens

Verfasst: 12.06.2018 20:34
von Mijikai
Danke @RSBasic

:shock:
Ich versteh nicht warum das immer aufgerufen werden muss...
also bei jeder #WM - Maus Nachricht!?

Re: [WinAPI] Ist Fenster aktiv? + Ist die Maus über dem Fens

Verfasst: 12.06.2018 20:40
von RSBasic
Soweit ich weiß ja.

Mit GetForegroundWindow_() kannst du ermitteln, ob dein Fenster aktiv ist. Oder in PB GetActiveWindow().

Re: [WinAPI] Ist Fenster aktiv? + Ist die Maus über dem Fens

Verfasst: 12.06.2018 21:47
von Mijikai
Habs jetzt so gelöst:

Code: Alles auswählen

 Case #WM_ACTIVATE
        \Window\Active = GetLoWord(wparam)