Seite 1 von 1
Tastendruck im Stringgadget?
Verfasst: 21.03.2005 17:28
von Kukulkan
Hallo,
Ich setze einen Text mit SetGadgetText() in ein Stringgadget. Dabei wird auch der Event #PB_EventType_Change ausgelöst.
Ich möchte nun aber wissen, ob der User in diesem Textfeld einen Buchstaben eingegeben oder gelöscht/geändert hat. Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat. Unter VB gibt es dafür den Event KeyPress(). Ich finde so etwas in PB nicht. Wie kann ich das erreichen?
Grüsse,
Volker
Verfasst: 21.03.2005 17:47
von Hanniball
Frag einfach die EventGadgetID() ab, bei jeder Eingabe in dein Textfeld wird die GadgetID deines Textfeldes angegeben.
Code: Alles auswählen
; Fenster usw
#wg=11
StringGadget(#wg,10,10,300,20,"Hallo")
Repeat
Event=WaitWindowEvent()
If Event=#PB_EventGadget
Debug EventGadgetID(); Hier auswerten wenn die ID Deines Textfeldes (im Beispiel 11) kommt
EndIf
Until Event=#PB_Event_CloseWindow
Verfasst: 21.03.2005 17:54
von Kukulkan
Hallo Hannibal,
Danke. Das gibt aber auch Events beim anklicken und wenn das Programm mit SetGadgetText() den Inhalt ändert. Ich will aber wissen ob der USER etwas getippt hat. So erhalte ich Events die ich nicht unterscheiden kann (geklickt, getippt oder SetGadgetText()).
So Einfach ist es dann doch nicht (sonst hätte ich sicher nicht das Forum bemüht).
Grüsse,
Volker
Verfasst: 21.03.2005 18:30
von Hanniball
Hi,
also wenn das
Programm den Inhalt ändert, musst Du das halt durch Deine Programmstruktur abfangen.
Wenn es Dir um das Ausschließen des Mausklicks geht, dann vergleich doch den Text - siehe unten oder beschreib Dein Problem noch mal genauer. Viele Grüße Hanniball
Code: Alles auswählen
#win=0:#sg=1
Global textalt$
OpenWindow(#win,0, 0, 800, 500, #PB_Window_SystemMenu, "ROMAHN - VERLAG")
CreateGadgetList(WindowID(#win))
StringGadget(#sg,10,10,300,20,"Hallo")
textalt$=GetGadgetText(#sg)
Repeat
Event=WaitWindowEvent()
If EventGadgetID()=#sg
textneu$=GetGadgetText(#sg)
If textneu$<>textalt$
Debug "getippt"
textalt$=textneu$
EndIf
EndIf
Until Event=#PB_Event_CloseWindow
Verfasst: 21.03.2005 19:25
von jear
@Volker Schmid
Versuch doch mal mit
Verfasst: 22.03.2005 08:43
von Kukulkan
@Hannibal:
Danke. Aber wie im
ersten Post schon geschrieben:
Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat.
Die Idee hatte ich auch schon, aber ich finde es höchst seltsam, wenn ich in verschiedenen Prozeduren den Text wechsle und dann mit einer globalen Variablen für jedes Feld prüfen muss ob sich was geändert hat.
@Jear:
Danke, das liegt nahe, nicht wahr

. Aber EventTyp() hat keine Unterscheidung für Tastendrücke. Guckst Du in Hilfe:
#PB_EventType_LeftClick : Klick mit der linken Maustaste
#PB_EventType_RightClick : Klick mit der rechten Maustaste
#PB_EventType_LeftDoubleClick : Doppelklick mit der linken Maustaste
#PB_EventType_RightDoubleClick : Doppelklick mit der rechten Maustaste
#PB_EventType_Focus : Fokus erhalten
#PB_EventType_LostFocus : Fokus verloren
#PB_EventType_Change : Inhalt hat sich geändert.
Und wie im
ersten Post schon geschrieben, liefert ein SetGadgetText() ebenfalls ein #PB_EventType_Change. Ich kann einen Tastendruck nicht vom Klick oder SetGadgetText() unterscheiden. Gibt es denn keinen Event für einen Tastendruck in einem Gadget?
Und irgendwie bekomme ich das Gefühl, dass hier keiner meine Frage im
ersten Post richtig gelesen hat...

Alle bis jetzt vorgeschlagenen Tipps habe ich in meinem ersten Posting bereits ausgeschlossen. So weit war ich bei Fragestellung auch.
Volker
Verfasst: 22.03.2005 08:48
von Kukulkan
@alle:
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
Volker
Verfasst: 22.03.2005 09:13
von Danilo
Volker Schmid hat geschrieben:@alle:
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
Schau doch mal in den Bereich 'Allgemein' diesen Beitrag an:
http://forums.purebasic.com/german/viewtopic.php?t=2518
Da wurde erst gestern etwas gezeigt was Dir dabei helfen könnte.
Verfasst: 22.03.2005 09:26
von Kukulkan
@danilo:
Danke!
Sowas in der Art habe ich als Antwort erwartet. Das sollte ich locker hinbekommen...
Grüsse,
Volker
Verfasst: 22.03.2005 10:16
von Kukulkan
Hallo,
Ich habe mir nun ein paar Hook-Routinen gebastelt und kann die ja hier reinstellen. So klappt es bei mir Wunderbar!
Code: Alles auswählen
Structure Hook
hWnd.l
OriginalAdress.l
EndStructure
; Liste für die gesetzten Hooks anlegen
NewList Hooks.Hook()
; ####### HookProzedur #######
Procedure KeyHookProc(hWnd, Msg, wParam, lParam)
; Beispiel für das auffangen eines Tastedrucks
If Msg = #WM_KEYDOWN
; Tasten wurden gedrückt!
Debug "Tastendruck!"
EndIf
; Mit Original-Prozedur weitermachen...
ForEach Hooks()
If Hooks()\hWnd = hWnd
; Original-Einsprungpunkt übergeben
Weiter.l = CallWindowProc_(Hooks()\OriginalAdress, hWnd, Msg, wParam, lParam)
Break
EndIf
Next
ProcedureReturn Weiter.l
EndProcedure
; ####### Start eines Hooks auf ein Gadget #######
Procedure.l StartHookOnGadget(hWnd, ProcAdress.l)
; ProcAdress erhält man mit @SubRoutineName()
AddElement(Hooks())
Hooks()\hWnd = hWnd
Hooks()\OriginalAdress = SetWindowLong_(hWnd, #GWL_WNDPROC, ProcAdress.l)
ProcedureReturn Hooks()\OriginalAdress
EndProcedure
; ####### Stoppen eines Hooks auf ein Gadget #######
Procedure StopHookOnGadget(hWnd)
; Benötigt den Handle des gehookten Gadgets (zB mit GadgetID())
ForEach Hooks()
If Hooks()\hWnd = hWnd
SetWindowLong_(hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
DeleteElement(Hooks())
Break
EndIf
Next
EndProcedure
; ####### Alle Hooks entfernen #######
Procedure StopHookOnAllGadgets()
ForEach Hooks()
SetWindowLong_(Hooks()\hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
Next
ClearList(Hooks())
EndProcedure
Anlegen kann man dann einzelne Hooks einfach so:
Code: Alles auswählen
StartHookOnGadget(GadgetID(#txtRuleNameProc), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtRuleNameWin), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtWindowTitle), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtProcessName), @KeyHookProc())
Beenden eines Hooks dann so:
Beenden aller Hooks geht dann so:
Vielleicht kann es ja mal jemand brauchen!
Grüsse,
Volker