hmm... ich stelle gerade fest, daß alt+tab doch nicht so korrekt funktioniert wie es sollte, wenn man InitKeyboard() : ExamineKeyboard() verwendet.
bug nummer 5.) normallerweise wird beim halten der alt taste und drücken/loslassen der tab taste, die anwendung minimiert und man kann durch erneutes drücken der tab taste hin und her wechseln zwischen den anwendungen. hier jedoch wird erst die anwendung minimiert, wenn man auch die alt taste loslässt.
sieht so aus als, hätte fred da wohl einiges verbockt...
das wäre der korrekte weg:
Code: Alles auswählen
ExamineDesktops()
DeskWidth = DesktopWidth(0)
DeskHeight = DesktopHeight(0)
DeskDepth = DesktopDepth(0)
If InitKeyboard() = #False Or InitSprite() = #False
End
ElseIf OpenScreen(DeskWidth,DeskHeight,DeskDepth,"Test") = #False
End
EndIf
Repeat
FlipBuffers()
ClearScreen(0, 0, 0)
ExamineKeyboard()
If IsScreenActive() = #True And ScreenSwitched = #False
SetWindowPos_(ScreenID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
StartDrawing(ScreenOutput())
DrawText("Press Alt+F4 to Quit")
StopDrawing()
If KeyAltTab = #True
KeyAltTab = #False
SetWindowPos_(ScreenID(), #HWND_NOTOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE) ;<--- damit die taskswitch-liste sichtbar wird und teile der anwendung diese nicht bedecken
ShowWindow_(ScreenID(), #SW_MINIMIZE) ;<--- damit die anwendung minimiert wird
ElseIf KeyAltF4 = #True
KeyAltF4 = #False
End
ElseIf KeyWin = #True
If GetAsyncKeyState_(#VK_LWIN) = #False And GetAsyncKeyState_(#VK_RWIN) = #False
KeyWin = #False
ShowWindow_(ScreenID(), #SW_MINIMIZE) ;<--- damit die anwendung minimiert wird
SetForegroundWindow_(FindWindow_("Shell_TrayWnd", 0))
PostMessage_(GetWindow_(FindWindow_("Shell_TrayWnd", 0), #GW_CHILD), #WM_LBUTTONDOWN, 0, 0)
EndIf
ElseIf KeyAlt = #True
If GetAsyncKeyState_(#VK_MENU)
If GetAsyncKeyState_(#VK_F4)
KeyAltF4 = #True
ElseIf GetAsyncKeyState_(#VK_TAB)
KeyAltTab = #True
Else
KeyAltTab = #False
KeyAltF4 = #False
EndIf
Else
KeyAlt = #False
EndIf
Else
GetAsyncKeyState_(#VK_TAB)
GetAsyncKeyState_(#VK_F4)
GetAsyncKeyState_(#VK_MENU)
GetAsyncKeyState_(#VK_LWIN)
GetAsyncKeyState_(#VK_RWIN)
If GetAsyncKeyState_(#VK_TAB) = #False And GetAsyncKeyState_(#VK_F4) = #False And GetAsyncKeyState_(#VK_MENU)
KeyAlt = #True
ElseIf GetAsyncKeyState_(#VK_LWIN) Or GetAsyncKeyState_(#VK_RWIN)
KeyWin = #True
EndIf
EndIf
ElseIf IsScreenActive() = #True And ScreenSwitched = #True
ScreenSwitched = #False
Else
ScreenSwitched = #True
EndIf
ForEver
End
im windowed-mode gibt es jedoch nur ein problem (welches ich nicht zu beheben weiss) mit den windows-tasten:
Code: Alles auswählen
Procedure IsWindowActive()
If GetForegroundWindow_() = WindowID()
Result = #True
Else
Result = #False
EndIf
ProcedureReturn Result.l
EndProcedure
hWnd.l = OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test")
If InitKeyboard() = #False Or InitSprite() = #False
End
ElseIf OpenWindowedScreen(hWnd, 0, 0, WindowWidth(), WindowHeight(), 0, 0, 0) = #False
End
EndIf
Repeat
Delay(10)
FlipBuffers()
ClearScreen(0, 0, 0)
ExamineKeyboard()
If IsWindowActive() = #True And ScreenSwitched = #False
If KeyWin = #True
If GetAsyncKeyState_(#VK_LWIN) = #False And GetAsyncKeyState_(#VK_RWIN) = #False
KeyWin = #False
;- PROBLEM! focus wird nicht zurückgesetzt, wenn man das startmenü wieder schliesst
SetForegroundWindow_(FindWindow_("Shell_TrayWnd", 0))
PostMessage_(GetWindow_(FindWindow_("Shell_TrayWnd", 0), #GW_CHILD), #WM_LBUTTONDOWN, 0, 0)
EndIf
Else
GetAsyncKeyState_(#VK_LWIN)
GetAsyncKeyState_(#VK_RWIN)
If GetAsyncKeyState_(#VK_LWIN) Or GetAsyncKeyState_(#VK_RWIN)
KeyWin = #True
EndIf
EndIf
ElseIf IsWindowActive() = #True And ScreenSwitched = #True
ScreenSwitched = #False
Else
ScreenSwitched = #True
EndIf
Select WindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
End
wenn man die windows-tasten drückt, verliert die anwendung den fokus und das startmenü wird aufgerufen. wenn man die windows-tasten erneut drückt oder man das startmenü andersweitig schliesst, sollte die anwendung, den fokus zurückbekommen, leider weiss ich nicht wie ich das manuell hinkriegen soll.
wer nicht weiss, was ich damit meine, hier als vergleich die korrekte arbeitsweise der windows-tasten, nämlich ohne InitKeyboard() : ExamineKeyboard():
Code: Alles auswählen
hWnd.l = OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test")
If InitSprite() = #False
End
ElseIf OpenWindowedScreen(hWnd, 0, 0, WindowWidth(), WindowHeight(), 0, 0, 0) = #False
End
EndIf
Repeat
Delay(10)
FlipBuffers()
ClearScreen(0, 0, 0)
Select WindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
End
c ya,
nco2k