Seite 1 von 2

Auf bestimmtes Tastenkombi reagieren

Verfasst: 09.03.2007 14:55
von dysti
Hey,
ich habe ein Eingabefenster mit nur Textfeldern und mit nur einen Button.
Wenn man auf den Button klickt, schließt sich das Fenster.
Jetzt möchte ich, das man die Tastenkombination
Strg-ALTGER-F12
drückt und sich dann das Fenster schließt.
Hinweis: Alt-F4 wird abgefangen.

Habe alles mögliche schon probiert.

Wie wird so etwas gemacht?

Verfasst: 09.03.2007 15:14
von Fluid Byte

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)
AddKeyboardShortcut(0,#PB_Shortcut_Alt | #PB_Shortcut_Control | #PB_Shortcut_F12,105)

Repeat
	EventID = WaitWindowEvent()
	
	If EventID = #PB_Event_Menu And EventMenu() = 105
		CloseWindow(0)
	EndIf
Until EventID = #WM_CLOSE

Verfasst: 09.03.2007 16:36
von Kaeru Gaman
@Fluid

könntest du bitte noch erklären, warum du die 105 gewählt hast?

Verfasst: 09.03.2007 16:49
von dysti
@Fluid Byte:
Das Programm bleibt auch nach Erstellung eines Buttons bei dieser Zeile hängen:

Code: Alles auswählen

EventID = WaitWindowEvent()
und gibt diese Fehlermeldung aus:

Code: Alles auswählen

At least one window should be opened to use command
Ich dachte immer, man müßte erst ein Menue erstellen mit dieser ID, z.B. 105 bei deiner Vorgabe und genau das möchte ich nicht.
Wenn es aber so geht wie du es vorgeschlagen hast, ist es auch ok.
Jetzt muß nur noch die Fehlermeldung weg.

Verfasst: 09.03.2007 16:50
von Fluid Byte
Sonst funktioniert es nicht! :twisted:

Ich benutze nie NULL als ID, jedenfalls nicht im Test-Stadium. Damit kann man prüfen ob sich ein Code mit variablen Angaben wirklich funktioniert oder sich auf NULL als Ausgangs ID verlässt. Somit habe Ich schon diverse Bugs aufgespürt.

[EDIT]
At least one window should be opened to use command
Du musst diesen Befehl benutzen nachdem du ein Fesnter erstellt hast.
Ich dachte immer, man müßte erst ein Menue erstellen mit dieser ID, z.B. 105 bei deiner Vorgabe und genau das möchte ich nicht.
Nix is'! Du brauchst kein Menü um das zu benutzen.
[/EDIT]

Verfasst: 09.03.2007 16:51
von edel
So kannst du auch das beenden abfangen :

Code: Alles auswählen

Procedure cb(hwnd,msg,wParam,lParam)
  
  If msg = #WM_SYSCOMMAND 
    If wParam = #SC_CLOSE
      result = MessageRequester("","Wirklich schliessen ?",#PB_MessageRequester_YesNo)
      If Not result = #PB_MessageRequester_Yes
        ProcedureReturn 0
      EndIf 
    EndIf 
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

hwnd = OpenWindow(0,0,0,100,100,"",#WS_OVERLAPPEDWINDOW)

SetWindowCallback(@cb())

Repeat
  e = WaitWindowEvent()
  
Until e = 16

Verfasst: 09.03.2007 18:09
von dysti
@Fluid Byte:
Ich verstehe deine Antwort nicht.
Ich habe dein Code so hieraus kopiert in den PB-Editor. Wenn ich es dann compiliere, bleibt das Prg stehen und gibt die Fehlermeldung aus.
Verstehst du jetzt, warum ich deine Antwort nicht verstehe.
Normal müßte es bei dir auch so sein.
Wenn es aber bei funktioniert, dann verstehe ich es nicht.
Habe PB 4.02.


@Edel: Das sieht gut aus, aber arbeitet mit Callback.
Nun ja, wenn es nicht anders geht, muß ich wohl die Callback-Version nehmen.
Habe es ausprobiert. Es ist da ja gar keine Tastenabfrage vorhanden.
Komme ich also auch nicht weiter.

Verfasst: 09.03.2007 18:21
von bobobo
es fehlt nur ein End hinter closewindow(0)

Da die ShortcutAbfrage nur MIT Fenster funktioniert
es aber genau durch die Tastenkombi geschlossen wird OHNE das
Programm zu Beenden.
Kompiliert sieht man von diesem Fehler allerdings vermutlich nichts mehr.

Verfasst: 09.03.2007 18:42
von dysti
Danke @bobobo.
Aber jetzt kommt der Hammer.
Ich habe das Original jetzt unter Xp kompiliert und nicht unter WIN2000.
Keine Fehlermeldung.

Verfasst: 09.03.2007 19:05
von Fluid Byte
dysti hat geschrieben:Danke @bobobo.
Aber jetzt kommt der Hammer.
Ich habe das Original jetzt unter Xp kompiliert und nicht unter WIN2000.
Keine Fehlermeldung.
Aha, daher stinkts! Bild

Ich habe ebenfalls XP und PB4.02 und es funktioniert tadellos. Das man bei Win2k ein END hinter CloseWindow() packen muss kann ich dir beim besten Willen nicht erklären.