VK_HOME wird als $ ausgegeben



  • ich möchte pos1 also VK_HOME abfragen, allerdings ist bei wchar_t $ damit verknüft.
    wie komme ich denn auf pos1? hat jemand einen idee?
    MfG blub



  • Ich verstehe die Frage nicht. Was haben denn die virtuellen Tastaturcodes mit wchar_t zu tun?!?



  • ich will auf pos1 kommen. dafür nutzte ich VK_HOME. ich erwarte also das Key=VK_Home pos1 ergibt. raus kommt aber $. ich möchte aber pos1 irgentwie bekommen. da Key eine wchar_t variable ist versuche ich herauszufinden, welchen wert ich zuweisen muss um pos1 zu erhalten.



  • Aus der Beschreibung wird man nicht schlau, zeig doch mal den relevanten Code.



  • also ich möchte das drücken der pos1 taste simulieren.
    das ereiche ich mit

    Key=VK_HOME;
    

    das solte ja den ausgelösten key auf pos1 setzten. statdessen wird das doller zeichen $ geschrieben. ich möchte aber statdessen pos1 bekommen. bekomme ich aber nicht. das was ich gerne wissen möchete ist welchen code die pos1 taste hat. dann kann ich die auch simmulieren. alles was ich dazu bisher gefunden habe sagt mir das VK_HOME das pos1 ergeben sollte.



  • Hallo,

    du suchst den Vituellen Keycode. Hier ist eine Liste.
    VK_HOME hat den Hexwert 0x24.
    Den Tastendruck simulierst du mit keybd_event oder einer passenden SendMessage.

    mfg
    kpeter



  • danke, die liste kannte ich schon, das keybd_event aber nicht, damit kann ich dann auch endlich meine keys per hotkey schreiben, danke.
    vorher hab ich versucht die 0x24 bzw. VK_HOME dem Key von OnKeyDown zu zuweisen, dann hat der aber immer nur $ geschrieben.
    das einzige problem ist noch, dass der bcb2010 keine simulierten tabs mag. der geht statdesen immer in die nächste zeile.
    eigentlich wollte ich die standard tastefolge zum einrücken pos1,tab, down auf eine taste legen, sodass ich nur diese drücken muss um die ein tab an derersten position einzufügen und die nächste zeile anzuwählen. im text editor klappt das wunderbar, im bcb2010 aber nicht.



  • Hallo,

    wie du den HotKey programmierst, ist leider nicht ersichtlich.

    Habe im BCB2009 mal versucht, deine angedachte Tastenfolge zu simulieren. Vielleicht klappts in der Version 2010 ja auch (warum eigentlich nicht?).

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Memo1->SetFocus();
       Memo1->TabStop = false;
       // zum Zeilenanfang
       keybd_event(VK_HOME, 0x24, KEYEVENTF_EXTENDEDKEY | 0, 0 );
       keybd_event(VK_HOME, 0x24, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
       // Message abarbeiten lassen
       Application->ProcessMessages();
    
       // Tab setzen
       SendMessage( Memo1->Handle, WM_CHAR, (WPARAM)(TCHAR)VK_TAB, NULL);
    
       // zum Zeilenende
       keybd_event(VK_END, 0x23, KEYEVENTF_EXTENDEDKEY | 0, 0 );
       keybd_event(VK_END, 0x23, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
       Application->ProcessMessages();
    
       // Return
       SendMessage( Memo1->Handle, WM_CHAR, (WPARAM)(TCHAR)VK_RETURN, NULL);
       Memo1->TabStop = true;
    }
    

    Habe festgestellt, dass Tab setzen schneller erfolgt als VK_HOME, deshalb ProcessMessages.

    edit:
    Sehe gerade, dass nur in die nächste Zeile gesprungen werden soll, kein Return, demnach würde für Zeilen 14 bis 20 stehen

    // nächste Zeile anspringen
       keybd_event(VK_DOWN, 0x28, KEYEVENTF_EXTENDEDKEY | 0, 0 );
       keybd_event(VK_DOWN, 0x28, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    

    mfg
    kpeter



  • den hotkey setze ich damit:

    Systemweiten Hotkey (Taste) definieren:

    *.cpp:

    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {

    UnregisterHotKey(Handle, HotKeyIdentifier_uint); //HotKey löschen
    GlobalDeleteAtom(HotKeyIdentifier_uint); //HotKey Identifier löschen

    }

    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {

    HotKeyIdentifier_uint = GlobalAddAtom("shift+pos1"); //beschreibung des hotkeys
    RegisterHotKey(Handle, HotKeyIdentifier_uint, MOD_CONTROL, VK_HOME); //Hotkey registrieren.

    // statt 0 kann auch MOD_ALT, MOD_CONTROL oder MOD_SHIFT stehen, falls Taste zusammen mit "Shift", "Strg" oder "Alt" gedrückt werden soll

    }

    //---------------------------------------------------------------------------
    void __fastcall TForm1::WMHotKey(TMessage &Msg)
    {

    TForm::Dispatch(&Msg);
    keybd_event(VK_HOME,0,0,0);
    keybd_event(VK_TAB,0,0,0);
    keybd_event(VK_DOWN,0,0,0);

    }

    *.h:

    class TForm1 : public TForm
    {

    __published: // Von der IDE verwaltete Komponenten
    void __fastcall FormDestroy(TObject *Sender);
    void __fastcall FormCreate(TObject Sender);
    private: // Anwender-Deklarationen
    void __fastcall WMHotKey(TMessage &Msg);
    unsigned int HotKeyIdentifier_uint;
    public: // Anwender-Deklarationen
    __fastcall TForm1(TComponent
    Owner);

    BEGIN_MESSAGE_MAP

    MESSAGE_HANDLER(WM_HOTKEY, TMessage, WMHotKey)

    END_MESSAGE_MAP(TForm)

    };
    gefunden auf http://fatman98.fa.funpic.de/builder_tricks.php

    so kann ich mit shift+pos1 die drei tasten aufrufen. das klappt im texteditor, aber nicht im bcb2010



  • blub1991 schrieb:

    das klappt im texteditor, aber nicht im bcb2010

    Sprichst du von der IDE des BCB 2010?



  • ja tu ich, die idee zu dem hotkey hatte ich ja, um das code-einrücken zu vereinfachen.



  • Da reicht doch ein Tastaturmakro?



  • theoretisch ja, ich interessiere mich aber auch für die möglichkeit, etwas mit den hotkeys zu machen. außerdem habe ich keine befriedigende Lösung für makros gefunden.



  • Zumal man das Makro nicht speichern kann, wie es scheint.

    Möglicherweise ist ein Keyboard-Hook eher angebracht.



  • kpeter schrieb:

    Zumal man das Makro nicht speichern kann, wie es scheint.

    Ich glaube, GExperts kann das.


Log in to reply