Auf bestimmte Taste warten



  • Hallo, mein Programm läuft im System-Tray, nebenher sollen andere aktionen augeführt werden (CS zoggen, In Word einen Brief schreiben, ...) Mit dem Tastenanschlag auf "DRUCK" soll mein Programm eine Aktion ausführen. Es soll also immer sehen ob "DRUCK" gedrückt wurde.

    Hab im Forum schon gesucht aber nichts passendes gefunden. Kann mir jemand Helfen das zu realisieren ?

    Wenn etwas unklar ist, bitte nochmal nachfragen.

    Danke, Gruß ranger81



  • FAQ, unter 'Tasten'!?



  • Hallo, also ich komm mit dem beispiel nur teilweise klar... hier meine codes:

    unit1.cpp

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TKeyHookForm *KeyHookForm;
    extern "C" __declspec(dllexport) __stdcall void SetHook(void);
    extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
    extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
    //---------------------------------------------------------------------------
    __fastcall TKeyHookForm::TKeyHookForm(TComponent* Owner)
      : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::KeyHook(TMessage &Message)
    {
      char Key[80];
      GetKeyNameText(Message.LParam, Key, 80);
      ListBox1->Items->Add(Key);
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::FormCreate(TObject *Sender)
    {
      SetHook();
    }
    //---------------------------------------------------------------------------
    void __fastcall TKeyHookForm::FormDestroy(TObject *Sender)
    {
      RemoveHook();
    }
    //---------------------------------------------------------------------------
    

    Unit1.h

    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    #define WM_KEYHOOK WM_USER+100
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TKeyHookForm : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
            TListBox *ListBox1;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall FormDestroy(TObject *Sender);
    private: // User declarations
      MESSAGE void __fastcall KeyHook(TMessage &Message);
        BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_KEYHOOK, TMessage, KeyHook);
        END_MESSAGE_MAP(TForm);
    public:     // Anwender-Deklarationen
            __fastcall TKeyHookForm(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TKeyHookForm *KeyHookForm;
    //---------------------------------------------------------------------------
    #endif
    

    hook_dll.cpp

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #define WM_KEYHOOK WM_USER+100
    HHOOK ghhookKB;
    HINSTANCE ghInst;
    #pragma argsused
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
      ghInst = hinst;
      return (1);
    }
    //---------------------------------------------------------------------------
    extern "C" __declspec(dllexport) __stdcall void SetHook(void);
    extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
    extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
    //---------------------------------------------------------------------------
    void __stdcall SetHook(void)
    {
      HOOKPROC lpfnHookProc = NULL;
      lpfnHookProc = GetProcAddress(GetModuleHandle("keydll.dll"),"CheckKey");
      ghhookKB = SetWindowsHookEx(WH_KEYBOARD, lpfnHookProc, ghInst, NULL);
    }
    //---------------------------------------------------------------------------
    void __stdcall RemoveHook(void)
    {
      UnhookWindowsHookEx(ghhookKB);
    }
    //---------------------------------------------------------------------------
    DWORD __stdcall CheckKey(int nCode, WORD wParam, LONG lParam)
    {
      HWND ghAppWnd = FindWindow("TKeyHookForm", 0);
      if((nCode < 0) || nCode == HC_NOREMOVE)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
      // Skip if it's a repeat
    if(lParam & 0x40000000)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
      // Send key information to the main window
      SendMessage(ghAppWnd, WM_KEYHOOK, 0, lParam);
      return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    

    In meinem Formular habe ich eine ListBox eingefügt und hab bei Ereignisse OnCreate auf FormCreate und OnDestroy auf FormDestroy gesetzt. Aber es kommt diese Warnung:

    [C++ Warnung] Unit1.h(19): W8027 Funktionen, die switch enthalten, werden nicht als Inline expandiert.
    

    und wenn das Programm gestartet ist macht es nicht das was es soll (die Tasten die gedrückt wurden anzeigen). Ich hab keine Ahnung warum... 😕

    -> Dazu sollte ich sagen dass ich mit DLLs noch nie was zu tun gehabt habe

    edit: hab auch auf Endgültig comiliert und die hook_dll.cpp bei "Dem projekt hinzufügen" hinzugefügt

    [ Dieser Beitrag wurde am 03.02.2003 um 22:27 Uhr von ranger81 editiert. ]



  • Du armer Kerl. Du hast den falschen Thread erwischt. Jansen meinte sicher den hier: Tasten - Systemweite Hotkeys à la ICQ

    [ Dieser Beitrag wurde am 04.02.2003 um 00:49 Uhr von WebFritzi editiert. ]


Anmelden zum Antworten