Announcement

Collapse
No announcement yet.

SetWindowsHookEx

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SetWindowsHookEx

    Hi Leute,

    Kann mir jemand ein kurzes Beispiel anführen, auf welche Weise kann ich drin einer Klasse die Funktion API SetWindowsHookEx benutzen. Es geht mir hier besonders um Zeiger auf Hook function.

    Danke im voraus
    Radek

  • #2
    Was du mit "in einer Klasse" meinst weiß ich leider nicht, bzw. wo ist das Problem "in einer Klasse".

    <pre>

    hTastaturHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPR OC TastaturTest,hInstGlob,NULL);

    if(hTastaturHook==NULL)
    {
    MessageBox(NULL,"Tastatur-HOOK??","Programmstart",MB_APPLMODAL|MB_ICONSTOP|M B_OK);
    }

    </pre&gt
    Christian

    Comment


    • #3
      Hi Christian,

      was würdest du schreiben, wenn die Funktion TastaturTest eine Methode deiner Klasse ist?

      R

      Comment


      • #4
        <pre>

        class myklasse
        {
        public:
        void TastaturTest()
        }

        void myklasse::TastaturTest()
        {
        hTastaturHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPR OC TastaturProc,hInstGlob,NULL); if(hTastaturHook==NULL)
        {
        MessageBox(NULL,"Tastatur-HOOK??","Programmstart",MB_APPLMODAL|MB_ICONSTOP|M B_OK);
        }
        }

        </pre&gt
        Christian

        Comment


        • #5
          Probiere also kompilieren. Es geht nicht.

          Comment


          • #6
            TastaturProc möchte ich in der Klasse auch haben

            Comment


            • #7
              Bezüglich der

              "TastaturProc möchte ich in der Klasse auch haben!"

              Wird das wohl nicht gehen. Hatte gerade die gleiche Erfahrung gemacht. Der Zeiger darf kein Zeiger auf eine Memberfunktion einer Klasse sein. (Sagt der Compiler und die Hilfe)

              <a href="/webx?50@@.ee8daef">Christian Marquardt "TStringList und CustomSort" 29.12.2002 08:22</a>

              Okay, Hook's sollten in DLL's sein. Hier ein Beispiel für einen Hook (ohne Klasse) mit gemeinsamer Speichernutzung:

              <pre>
              //---------------------------------------------------------------------------
              #include "vcl.h"
              #pragma hdrstop
              #include "urlmessagedll.h"

              USERES("URLmessage.res");
              //---------------------------------------------------------------------------
              int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
              {
              hInstGlob=hinst;
              HANDLE hMapObject=NULL;
              BOOL fInit,fIgnore;
              switch(reason)
              {
              case DLL_PROCESS_ATTACH:
              hMapObject = CreateFileMapping((HANDLE) 0xFFFFFFFF,NULL,PAGE_READWRITE,0,4096,"dllmemfilem ap");
              if(hMapObject==NULL)
              return FALSE;
              fInit=(GetLastError()!=ERROR_ALREADY_EXISTS);
              lpvMem=MapViewOfFile(hMapObject,FILE_MAP_WRITE,0,0 ,0);
              if(lpvMem==NULL)
              return FALSE;
              if(fInit)
              memset(lpvMem,0,4096);
              break;

              case DLL_THREAD_ATTACH:
              break;

              case DLL_THREAD_DETACH:
              break;

              case DLL_PROCESS_DETACH:
              fIgnore=UnmapViewOfFile(lpvMem);
              fIgnore=CloseHandle(hMapObject);
              break;
              }
              return true;
              }
              //---------------------------------------------------------------------------

              void DLL_EXP StartDll()
              {
              hTastaturHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPR OC)TastaturTest,hInstGlob,NULL);
              if(hTastaturHook==NULL)
              {
              MessageBox(NULL,"Tastatur-HOOK??","Programmstart",MB_APPLMODAL|MB_ICONSTOP|M B_OK);
              }
              hMausHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Maus Test,hInstGlob,NULL);
              if(hMausHook==NULL)
              {
              MessageBox(NULL,"Maus-HOOK??","Programmstart",MB_APPLMODAL|MB_ICONSTOP|M B_OK);
              }
              if(!SetEnvironmentVariable("HookAccess","0"))
              {
              MessageBox(NULL,"Environment??","Programmstart",MB _APPLMODAL|MB_ICONSTOP|MB_OK);
              }
              memcpy(lpvMem,&lastActiv,sizeof(lastActiv));
              }
              //---------------------------------------------------------------------------

              void DLL_EXP StopDll()
              {
              if(hTastaturHook!=NULL)
              UnhookWindowsHookEx(hTastaturHook);
              if(hMausHook!=NULL)
              UnhookWindowsHookEx(hMausHook);
              }
              //---------------------------------------------------------------------------

              LRESULT CALLBACK DLL_EXP TastaturTest(int nCode,WORD wp,DWORD lp)
              {
              if(nCode==HC_ACTION)
              {
              lastActiv=GetTickCount();
              memcpy(lpvMem,&lastActiv,sizeof(lastActiv));
              }
              return (int)CallNextHookEx(hTastaturHook,nCode,wp,lp);
              }
              //---------------------------------------------------------------------------

              LRESULT CALLBACK DLL_EXP MausTest(int nCode,WORD wp,DWORD lp)
              {
              String count;
              if(nCode==HC_ACTION)
              {
              lastActiv=GetTickCount();
              memcpy(lpvMem,&lastActiv,sizeof(lastActiv));
              }
              return (int)CallNextHookEx(hMausHook,nCode,wp,lp);
              }
              //---------------------------------------------------------------------------

              DWORD DLL_EXP GetLastActiv()
              {
              DWORD aktTime=GetTickCount();
              memcpy(&lastActiv,lpvMem,sizeof(lastActiv));
              return(aktTime-lastActiv)/1000;
              }
              //---------------------------------------------------------------------------

              </pre&gt
              Christian

              Comment


              • #8
                Ich weiß nicht, ob das euch C++-Builderern was nützt, aber für Delphi gibt's Routinen MakeObjectInstance (in der VCL - Forms.pas) und MakeHookInstance (im Netz, z.B. http://www.undu.com/Articles/980415b.htm). Die machen aus Delphi-Methoden mittels böser Tricks "globale" Routinen, um sie als Hooks oder WndProcs verwenden zu können. Da auch im BCB Delphi-Methoden (procedure ... of object) als __closure oder so leben, kann man da vielleicht was drehen.
                <br>HTH, Uli

                Comment


                • #9
                  Halo Christian,

                  ich habe mein Problem ausgelöst. Meine Funktion TastaturProc ist friend Funktion in meiner Klasse. Aus diesem Grund kann ich auch auf private Elemente von Klasse zugreifen. Es ging mir darum. Das funktioniert einwandfrei.

                  Rade

                  Comment


                  • #10
                    ja das geht, es geht auch wenn die Funktion static wäre. Das ist dann aber 1 Funktion für alle Instanzen der Klasse. Ich wollte damit sagen, dass eine solche Funktion einzeln für jede instanz wohl nicht geh
                    Christian

                    Comment

                    Working...
                    X