Problem mit Keyboardeingabe abfangen

Anfängerfragen zum Programmieren mit PureBasic.
han123
Beiträge: 9
Registriert: 28.05.2006 23:32

Problem mit Keyboardeingabe abfangen

Beitrag von han123 »

Hi,

ich habe mit dem folgenden Code ein Problem und zwar blitzt das Fenster immer nur ganz kurz auf. Ich weiß aber nicht, warum es bei drücken der beiden Tasten nicht ganz dableibt.

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
HideWindow(0,1)
fenster_versteckt=1
For r=0 To 255 : GetAsyncKeyState_(r) : Next ; Keybuffer vorbereiten 
Repeat 
  Sleep_(1) 
  If GetAsyncKeyState_(#VK_SPACE)=-32767 And GetAsyncKeyState_(#VK_LCONTROL)=-32767 ; Wurden Control und Space gedrückt?

    Debug "'Ctrl-Space' wurde gedrückt" 
    If fenster_versteckt=1
      HideWindow(0,0)
      fenster_versteckt=0
    EndIf
    If fenster_versteckt=0
      HideWindow(0,1)
      fenster_versteckt=1
    EndIf  
  EndIf 
ForEver 
EndIf
Erscheinen soll das Fenster wenn man Control und Space gleichzeitig drückt.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problem mit Keyboardeingabe abfangen

Beitrag von Kiffi »

> Ich weiß aber nicht, warum es bei drücken der beiden Tasten nicht ganz
> dableibt.

das liegt daran, weil Du fenster_versteckt auf 0 setzt und kurz darauf
prüfst, ob fenster_versteckt auf 0 steht und daraufhin das Fenster wieder
versteckst. Kapiert, was ich meine? ;-)

Wenn Du ElseIf verwendest, dann sollte es funktionieren:

Code: Alles auswählen

    If fenster_versteckt=1
      HideWindow(0,0)
      fenster_versteckt=0
    ElseIf fenster_versteckt=0
      HideWindow(0,1)
      fenster_versteckt=1
    EndIf  
Du hast übrigens keine mustergültige Eventschleife gebaut. Aber das ist ja
nicht Gegenstand der Frage gewesen.

Grüße ... Kiffi
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

genau DAS wollte ich schreiben lol

konnte es nicht richtig formulieren :mrgreen:
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
han123
Beiträge: 9
Registriert: 28.05.2006 23:32

Beitrag von han123 »

Klappt irgendwie immer noch nicht :freak:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
HideWindow(0,1)
fenster_versteckt=1
For r=0 To 255 : GetAsyncKeyState_(r) : Next ; keyboardbuffer vorbereiten
Repeat 
  Sleep_(1) 
  If (GetAsyncKeyState_(#VK_LCONTROL)=-32767) And fenster_versteckt=1
          HideWindow(0,0)
          fenster_versteckt=0
  EndIf
  If (GetAsyncKeyState_(#VK_LCONTROL)=-32767) And fenster_versteckt=0
          HideWindow(0,1)
          fenster_versteckt=1
  EndIf  
;For r=0 To 255 : GetAsyncKeyState_(r) : Next

    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; wurde das x gedrückt?
      Quit = 1
    EndIf

Until Quit=1
EndIf
End

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
HideWindow(0,1)
fenster_versteckt=1
For r=0 To 255 : GetAsyncKeyState_(r) : Next ; keyboardbuffer vorbereiten
Repeat 
  Sleep_(1) 
  If (GetAsyncKeyState_(#VK_LCONTROL)=-32767)
    If fenster_versteckt=1
      HideWindow(0,0)
      fenster_versteckt=0
    ElseIf fenster_versteckt=0
      HideWindow(0,1)
      fenster_versteckt=1
    EndIf  
  EndIf
;For r=0 To 255 : GetAsyncKeyState_(r) : Next

    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; wurde das x gedrückt?
      Quit = 1
    EndIf

Until Quit=1
EndIf
End
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Klappt irgendwie immer noch nicht :freak:

1. Hast Du jetzt Deinen Code komplett umgewürfelt.

2. Hast Du meinen Beitrag nicht gelesen

3. Ist mir das jetzt zu spät, um dir zu erklären, was weshalb nicht funktioniert.
(Dafür müsste ich auch erst mal wissen, was Du überhaupt vorhast.)

Gut's Nächtle ... Kiffi

// Edit:

4. Den Code, um den es ursprünglich ging, hast Du noch an Dein Posting
angehängt, während ich obige Zeilen schrieb. Wieso postest Du 2 Codes?
han123
Beiträge: 9
Registriert: 28.05.2006 23:32

Beitrag von han123 »

Ja, im zweiten Codeblock habe ich aber schon deinen Vorschlag aufgegriffen und versucht umzusetzen.
Mein Ziel bei dem ganzen ist, dass ich das Programm starte und z.B. in Notepad etwas tippe und mein Programm aufgerufen wird, wenn ich eine bestimmte Tastenkombination drücke.

PS: Gute Nacht :D

Edit:
Ich glaube, ich habe in der MSDN gefunden, was ich eigentlich will, aber ich weiß nicht, wie ich das in PB umsetzen soll:
RegisterHotKey Function

The RegisterHotKey function defines a system-wide hot key.

Syntax

Code: Alles auswählen

    BOOL RegisterHotKey(      

        HWND hWnd,
        int id,
        UINT fsModifiers,
        UINT vk
    );
Parameters

hWnd
[in] Handle to the window that will receive WM_HOTKEY messages generated by the hot key. If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.
id
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier.
fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values.

MOD_ALT
Either ALT key must be held down.
MOD_CONTROL
Either CTRL key must be held down.
MOD_SHIFT
Either SHIFT key must be held down.
MOD_WIN
Either WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo.

vk
[in] Specifies the virtual-key code of the hot key.

Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #pb_Window_invisible)
  
  fenster_versteckt = 1
  
  RegisterHotKey_(WindowID(0) , 666 , #MOD_CONTROL , #VK_SPACE) 
  
  Repeat
    
    Event = WaitWindowEvent()
    
    If event = #WM_HOTKEY 
      fenster_versteckt ! 1  
      HideWindow(0,fenster_versteckt)
      ;Debug EventwParam() ; <--- id
    EndIf
    
  Until event = #PB_Event_CloseWindow
  
EndIf 
strg + space

Die id bei RegisterHotKey kannst du eine Zahl eingeben um den Hotkeyzu identifizieren , nuetzlich bei mehreren.
han123
Beiträge: 9
Registriert: 28.05.2006 23:32

Beitrag von han123 »

Lol,
so einfach geht das...
Vielen Dank :allright:

Bist mein persönlicher Held für heute :D
Antworten