Abfrage auf "losgelassene" Taste???



  • Hallo!
    Ich habe da ein Problem in einem Programm, das ich schreibe. Und zwar muss ich mitbekommen, wenn ich eine Taste loslasse, die ich zuvor mit dieser Routine abgefragt habe:

    void __fastcall TForm1::WMHotKey(TMessage &Msg)
    {
      unsigned short test = 0;
      TForm::Dispatch(&Msg);
      test = Msg.LParamHi;
      switch(test)
      {
        case VK_DOWN:   //Bewege Y-Achse "rauf"
          Statusfenster->Lines->Add("hoch");
          break;
    
        case VK_UP:     //Bewege Y-Achse "runter"
          Statusfenster->Lines->Add("runter");
          break;
    
        case VK_LEFT:   //Bewege X-Achse "links"
          Statusfenster->Lines->Add("links");
          break;
    
        case VK_RIGHT:  //Bewege X-Achse "rechts"
          Statusfenster->Lines->Add("rechts");
          break;
    
        case VK_PRIOR:  //Bewege Z-Achse "rauf"
          Statusfenster->Lines->Add("bild auf");
          break;
    
        case VK_NEXT:   //Bewege Z-Achse "runter"
          Statusfenster->Lines->Add("bild ab");
          break;
    
        case VK_HOME:   //Drehe Drehachse "rechts"
          Statusfenster->Lines->Add("Position1");
          break;
    
        case VK_END:    //Drehe Drehachse "links"
          Statusfenster->Lines->Add("Ende");
          break;
    
        case VK_ADD:    //Erhöhe Verfahrgeschw. der ausgew. Achse
          Statusfenster->Lines->Add("+");
          // Hole Geschw.-Wert der akt. Achse und erhöhe diesen um "x". Schreibe ihn zurück und aktualisiere die Anzeige!
          break;
    
        case VK_SUBTRACT:   //Verringere Verfahrgeschw. der ausgew. Achse
          Statusfenster->Lines->Add("-");
          break;
    
        case VK_MULTIPLY:   //Wähle Achse aus
          Statusfenster->Lines->Add("*");
          this->Achsenauswahl_BtnClick(this);
          break;
    
        default: ;
    
      } //end switch
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     /* Eine eindeutige ID für den Hotkey suchen. Der String ist egal.             *
      * Sinnvollerweise beschreibend zum Hotkey. Diese ID wird auch benötigt, wenn *
      * man den Hotkey zerstören will. Daher sollte der Wert irgendwo in der Klasse*
      * welche den HotKey verwaltet gespeichert werden.                            */
      HotKeyIdentifier_uint_up = GlobalAddAtom("UP-Hotkey");
      HotKeyIdentifier_uint_down = GlobalAddAtom("DOWN-Hotkey");
      HotKeyIdentifier_uint_left = GlobalAddAtom("LEFT-Hotkey");
      HotKeyIdentifier_uint_right = GlobalAddAtom("RIGHT-Hotkey");
      HotKeyIdentifier_uint_up_right = GlobalAddAtom("UP_RIGHT-Hotkey");
      HotKeyIdentifier_uint_down_right = GlobalAddAtom("DOWN_RIGHT-Hotkey");
      HotKeyIdentifier_uint_up_left = GlobalAddAtom("UP_LEFT-Hotkey");
      HotKeyIdentifier_uint_down_left = GlobalAddAtom("DOWN_LEFT-Hotkey");
    
      HotKeyIdentifier_uint_add = GlobalAddAtom("PLUS-Hotkey");     //Hotkey, für Geschwindigkeitserhöhung
      HotKeyIdentifier_uint_sub = GlobalAddAtom("SUBTRACT-Hotkey"); //  "   , für      -"-        verringerung
    
      HotKeyIdentifier_uint_multi = GlobalAddAtom("MULTIPLY-Hotkey"); //Hotkey, zur Achsenauswahl
    
      /* Die Modifier sind die Tasten welche zusätzlich auch noch gedrückt werden   *
      * müssen. Also z.B. Control oder so. Hier ist es keine (0). Um genauere      *
      * Info zu erhalten musst du einfach in der Hilfe unter "RegisterHotKey" nach *
      * lesen. (Windows SDK Hilfe)                                                 */
      unsigned int HotKeyModifier_uint = 0;
      RegisterHotKey(Handle, HotKeyIdentifier_uint_up, HotKeyModifier_uint, VK_UP); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_down, HotKeyModifier_uint, VK_DOWN); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_left, HotKeyModifier_uint, VK_LEFT); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_right, HotKeyModifier_uint, VK_RIGHT); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_up_right, HotKeyModifier_uint, VK_PRIOR); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_down_right, HotKeyModifier_uint, VK_NEXT); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_up_left, HotKeyModifier_uint, VK_HOME); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_down_left, HotKeyModifier_uint, VK_END); //Hotkey registrieren.
    
      RegisterHotKey(Handle, HotKeyIdentifier_uint_add, HotKeyModifier_uint, VK_ADD); //Hotkey registrieren.
      RegisterHotKey(Handle, HotKeyIdentifier_uint_sub, HotKeyModifier_uint, VK_SUBTRACT); //Hotkey registrieren.
    
      RegisterHotKey(Handle, HotKeyIdentifier_uint_multi, HotKeyModifier_uint, VK_MULTIPLY); //Hotkey registrieren.
    }
    //---------------------------------------------------------------------------
    

    Gibt es da irgendeine Möglichkeit? Zur Zeit komme ich nämlich nicht weiter.

    Danke im Voraus, Benny!!!



  • Es gibt doch im C++ Builder die Ereignisse: OnKeyUp,OnKeyDown & OnKeyPress

    Schon damit versucht ??

    C U Evilissimo



  • Das Problem ist, dass ich auf einer Form arbeite mit vielen Eingabefeldern und Tasten (BitButtons). Ich muss aber egal, in welchem Eingabefeld ich mich befinde, die Pfeiltasten, Pos1, Bild auf/ab und Ende drücken können, damit eine bestimmte Fkt, die hinter den BitButtons liegt aufrufen kann. Ich habe leider keine Fkt. gefunden, mit der ich das so erreichen konnte, also habe ich Hotkeys angelegt, die "global" auf der Form abgelegt sind.
    Ich hoffe das verdeutlicht mein Problem 🙂

    Gruß, Benny!



  • Setz die KeyPreview-Property der Form auf true, damit bekommt diese das Event immer zuerst, egal, welches Control gerade den Focus hat.



  • @Jansen: Ok. Danke erstmal. Aber eine Frage hätte ich da noch. Bekomme ich dann auch mit, wenn eine Taste eben losgelassen wird?

    Gruß, Benny!



  • ja



  • Hallo nochmal!
    Ich habe in den Hilfen von Borland mal zu KeyPreview nachgeschaut und genau das gefunden, was ich leider irgendwie umgehen muss. Nämlich, dass ich beim Pfeiltastendruck nicht zwischen den Buttons hin-und herspringe. Wenn mir das noch jmd sagen könnte, wie ich das umgehe wäre mir erstmal weitergeholfen!

    ///////////////////////////////////////////////////////////////////////////////
    Die Eigenschaft KeyPreview bestimmt, ob das Formular Tastaturereignisse vor dem aktiven Steuerelement erhält.

    __property bool KeyPreview = {read=FKeyPreview, write=FKeyPreview, stored=IsForm, default=0};

    Beschreibung

    Hat KeyPreview den Wert true, erhält das Formular Tastaturereignisse vor dem aktiven Steuerelement (das in der Eigenschaft ActiveControl angegeben ist).

    Ist KeyPreview auf false gesetzt, gehen Tastaturereignisse an das aktive Steuerelement.

    Die Einstellung bezieht sich nicht auf Navigationstasten (TAB, Pfeiltasten usw.), da diese keine Tastaturereignisse auslösen. Entsprechendes gilt für die Eingabetaste, wenn eine Schaltfläche den Fokus hat oder die Eigenschaft Default einer Schaltfläche true ist.

    Die Standardeinstellung für KeyPreview ist false.
    ///////////////////////////////////////////////////////////////////////////////

    Gruß, Benny!



  • Probier mal

    TForm::Dispatch(&Msg);
    

    in default Zweig Deines Switch auszuführen - d.h. nur wenn keine eigene Behandlung stattfand, Standardroutine ausführen!

    Ich mach sowas in WndProc, dort gehts so.

    [ Dieser Beitrag wurde am 24.02.2003 um 13:35 Uhr von DerAltenburger editiert. ]

    [ Dieser Beitrag wurde am 24.02.2003 um 13:38 Uhr von DerAltenburger editiert. ]



  • An Alle, die geantwortet haben erstmal Danke!
    Das Problem hat sich mehr oder weniger erledigt.

    Gruß, Benny!

    P.S.: Ich habe es mit der KeyPreview-Eigenschaft gemacht. Wer wissen möchte, wie, einfach mal fragen 🙂



  • Sag's doch einfach mal kurz! 😃 😃 😃



  • Also: nachdem ich die KeyPreview-Eigenschaft der Hautform auf "true" gesetzt hatte, konnte ich mit den Fkt. OnKeyDown, OnKeyUp, etc. jeden Tastendruck irgendwo auf der Form abfangen und zuerst bearbeiten. Also habe ich in OnKeyDown nur auf die Pfeiltasten abgefragt und alle anderen Tastendrücke durchgelassen. Das wars eigentlich.
    Warum schwierig machen, wenns auch einfach geht? Aber hinterher ist man ja generell schlauer 😃
    Naja einen kleinen Haken hat die Sache noch. Diese KeyPreview-Sache scheint irgendwie relativ viel Rechenzeit zu benötigen. Nach der Einbindung mußte ich mir noch einen "Sleep" vor der Ausgabe über die serielle Schnittstelle setzen, weil da irgendwas nicht mehr stimmte. Naja Schwund ist immer 🙂

    Gruß, Benny!


Anmelden zum Antworten