Seite 2 von 3

Verfasst: 22.11.2004 08:16
von Danilo
nco2k hat geschrieben:@Danilo
ich benütze bewusst nicht InitKeyboard() : ExamineKeyboard(), weil dadurch einige "von haus aus" windows funktionen (wie z.b. die win-tasten usw.) wegfallen würden.
OK, war auch nur mal zum nachfragen.

Ich habe vor 2,5 - 3 Jahren ein paar male was ohne ExamineKeyboard
machen wollen (da kein Keyboard gebraucht wurde), und dann
hat sich das Programm bei ESC meist einfach beendet.
Da hatte ich schon Probleme das es mit diesem PB-DirectX-Zeug
das ganze Win2k runtergerissen hat, und einfach rebootet wurde.
Das hab ich sonst noch nie geschafft, außer eben mit PB/DX.

Ich hatte mir dann angewöhnt *immer* ein ExamineKeyboard
zu verwenden, auch wenn ich keine Keys brauche.
Seitdem nie mehr irgendwelche Probleme oder Crashs gehabt.

Vielleicht kannst Du ja das ExamineKeyboard trotzdem reinmachen
und Deine Sondertasten (oder alle Tasten) weiterhin mit API prüfen?

Verfasst: 22.11.2004 17:59
von nco2k
@Danilo
echt traurig sowas... es wäre zwar eine möglichkeit, aber der bug bleibt trotzdem noch weiterhin bestehen und sollte gefixt werden. :(

edit:
warum werden eigentlich überhaupt die windows-tasten bei InitKeyboard() : ExamineKeyboard() standardmässig gesperrt?! alt+tab wurde doch auch nicht gesperrt, was auch gut ist und so bleiben sollte. ich persönlich finde, daß fred die windows-tasten standardmässig entsperren sollte.

c ya,
nco2k

Verfasst: 22.11.2004 20:55
von Kaeru Gaman
gute frage, keine ahnung warum.

juckt mich aber nicht, ich benutz die eh nicht, sind mir nur im weg.
ich finds power-ärgerlich, wenn man beim zocken aus versehen draufkommt.

Verfasst: 22.11.2004 20:58
von nco2k
@Kaeru Gaman
und ich finde es ärgerlich, wenn ich beim zocken bewusst die taste drücke und diese dann nicht funktioniert. :mrgreen:

c ya,
nco2k

Verfasst: 22.11.2004 21:05
von Kaeru Gaman
Bild da haste auch wieder recht.

Verfasst: 22.11.2004 22:51
von nco2k
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

Verfasst: 30.11.2004 06:25
von nco2k
bug nummer 6.)

im folgenden beispiel, kann man zwischen dem windowed und fullscreen modus wechseln, indem man alt+return drückt. hält man jedoch die alt taste gedrückt und drückt die return taste erneut, passiert nichts! schaltet man aber ExamineKeyboard() aus, dann funktioniert es wie es sollte.

Code: Alles auswählen

#Title = "Test"

Global Fullscreen.l

Procedure Open_Screen()
  ExamineDesktops()
  Width = DesktopWidth(0)
  Height = DesktopHeight(0)
  Depth = DesktopDepth(0)
  Fullscreen = 1
  If OpenScreen(Width, Height, Depth, #Title) = 0
    End
  EndIf
EndProcedure

Procedure Open_Window()
  Fullscreen = 0
  hWnd.l = OpenWindow(0, 0, 0, 640, 480, #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_ScreenCentered, #Title)
  If OpenWindowedScreen(hWnd, 0, 0, WindowWidth(), WindowHeight(), 1, 0, 0) = 0
    End
  EndIf
EndProcedure

If InitSprite() = 0 Or InitKeyboard() = 0
  End
EndIf

Open_Window()

Repeat
  
  Delay(10)
  
  FlipBuffers()
  ClearScreen(0, 0, 0)
  
  ;ExamineKeyboard() ;<--- einschalten um den unterschied zu sehen!
  
  If KeyAltReturn = #True
    KeyAltReturn = #False
    CloseScreen()
    If Fullscreen = 1
      Open_Window()
    Else
      CloseWindow(0)
      Open_Screen()
    EndIf
  ElseIf KeyAlt = #True
    If GetAsyncKeyState_(#VK_MENU)
      If GetAsyncKeyState_(#VK_RETURN)
        KeyAltReturn = #True
      Else
        KeyAltReturn = #False
      EndIf
    Else
      KeyAlt = #False
    EndIf
  Else
    GetAsyncKeyState_(#VK_RETURN)
    GetAsyncKeyState_(#VK_MENU)
    If GetAsyncKeyState_(#VK_RETURN) = #False And GetAsyncKeyState_(#VK_MENU)
      KeyAlt = #True
    EndIf
  EndIf

  If Fullscreen = 0
    Select WindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  EndIf
  
ForEver

End
so langsam gehen mir diese kinderkrankheiten echt auf den keks...

verwende ich InitKeyboard() : ExamineKeyboard(), funktionieren meine abfragen nach einem screenswitch nicht mehr richtig (wenn/solang man auf der taste bleibt). zudem funktioniert ein taskswitch per alt+tab nicht ordnungsgemäß und die windows-tasten sind gesperrt, was ich persönlich sehr sehr schlecht finde. das einzig gute, ist der automatische hook von der print-taste. lasse ich jedoch InitKeyboard() : ExamineKeyboard() weg, dann geht die escape taste nicht richtig, ich muss mich um den hook für die print-taste selber kümmern, aber die windows-tasten und alt+tab taskswitch funktionieren... man kann es drehen und wenden wie man will, zudem bleiben bug 2.) und 3.) bei beiden varianten bestehen!

p.s.: wer weiss, welche bugs noch in der tiefe schlummern. :freak:

c ya,
nco2k

Verfasst: 30.11.2004 07:27
von nco2k
bug nummer 7.)

edit: kein bug, sorry mein fehler...

wenn InitKeyboard() : ExamineKeyboard() ausgeschaltet ist und man die linke alt taste drückt und loslässt, bleibt die anwendung "stehen" bis man erneut die alt taste drückt oder mit der maus auf/in das fenster klickt bzw. es bewegt oder wahrscheinlich ein anderes ereignis geschieht...

Code: Alles auswählen

hWnd.l = OpenWindow(0, 0, 0, 640, 480, #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test")
If InitSprite() = 0 Or InitKeyboard() = 0
  End
ElseIf OpenWindowedScreen(hWnd, 0, 0, WindowWidth(), WindowHeight(), 1, 0, 0) = 0
  End
ElseIf LoadSprite(0, "c:\test.bmp") = 0 ;<--- bild muss vorhanden sein!
  End
EndIf

Repeat
  
  Delay(10)
  
  FlipBuffers()
  ClearScreen(0, 0, 0)
  
  If X = 500
    X = 0
  EndIf
  DisplaySprite(0, X, 0)
  X + 5
  
  ;ExamineKeyboard() ;<--- einschalten um den unterschied zu sehen!
  If KeyAltReturn = #True
    KeyAltReturn = #False
    ;Debug
  ElseIf KeyAlt = #True
    If GetAsyncKeyState_(#VK_MENU)
      If GetAsyncKeyState_(#VK_RETURN)
        KeyAltReturn = #True
      Else
        KeyAltReturn = #False
      EndIf
    Else
      KeyAlt = #False
    EndIf
  Else
    GetAsyncKeyState_(#VK_RETURN)
    GetAsyncKeyState_(#VK_MENU)
    If GetAsyncKeyState_(#VK_RETURN) = #False And GetAsyncKeyState_(#VK_MENU)
      KeyAlt = #True
    EndIf
  EndIf
  
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect
  
ForEver

End
was soll man dazu noch sagen...

c ya,
nco2k

Verfasst: 30.11.2004 08:31
von Danilo
nco2k hat geschrieben:bug nummer 7.)

wenn InitKeyboard() : ExamineKeyboard() ausgeschaltet ist und man die linke alt taste drückt und loslässt, bleibt die anwendung "stehen" bis man erneut die alt taste drückt oder mit der maus auf/in das fenster klickt bzw. es bewegt oder wahrscheinlich ein anderes ereignis geschieht...
Mit ExamineKeyboard (also dem PB-Weg) bleibt hier nichts
stehen, da PB die Tasten über DX abfragt.

Über API bleibt es logischerweise stehen. Schau doch mal
für was die ALT-Taste beim WinAPI benutzt wird:
Zum auswählen vom Fenster-Menu.

Drücke doch mal die ALT-Taste, so daß Dein Beispiel "stehenbleibt",
und benutze dann mal die Cursor-Tasten hoch und runter.
Da siehst Du dann auch das Fenster-Menu was Du mit ALT
angewählt hast.
Das während dieser Zeit die Hauptschleife nicht mehr abgearbeitet
wird ist normal. Solange bis Du das Menu abwählst, z.B. mit
erneutem ALT oder auch ESC.

Entfernst Du das Fenster-Menu (also das Flag #PB_Window_SystemMenu),
dann bleibt auch nichts mehr stehen, da kein Menu mehr vorhanden.

Verfasst: 30.11.2004 09:22
von nco2k
sorry stimmt, daran hab ich garnicht gedacht in dem moment (ist auch sehr früh am morgen, zu meiner verteidigung :D ). ein keyhook für die alt-taste wäre dann auch eine lösung für den fall, daß man auf das system-menü nicht ganz verzichten will.

trotzdem weiss ich nicht, ob ich mit InitKeyboard() : ExamineKeyboard() oder ohne besser bedient bin. naja warten wir mal ab...

c ya,
nco2k