Einzelnen Beitrag anzeigen

originalhanno

Registriert seit: 20. Feb 2006
33 Beiträge
 
#6

Re: warum HookHandle global machen?

  Alt 15. Apr 2006, 15:40
Ich habe die Variablen aber ausserhalb von


Code:
#pragma data_seg ("shared")


#pragma data_seg ()
deklariert.
Um das noch mal zu prüfeb, habe ich folgendes Beispiel:



Code:
#define MAKE_DLL

// INCLUDES //////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <String.h>
#include "Hook.h"
using namespace std;
#pragma data_seg ("shared")

//iNumInstances = 0;
//HHOOK hMouseHook =0;
#pragma data_seg ()
#pragma comment(linker,"/SECTION:shared,RWS")

// PROTOTYPES ////////////////////////////////////////////////////////////

LRESULT CALLBACK MouseHookProc(int, WPARAM, LPARAM);

// VARIABLES /////////////////////////////////////////////////////////////
HINSTANCE   hDllInstance;
HHOOK hMouseHook =0;
int x, y=0;
char message[10];

// METHODS ///////////////////////////////////////////////////////////////

// FUNCTIONS /////////////////////////////////////////////////////////////

int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
   hDllInstance = hInstance;
   return TRUE;
}

BOOL CALLBACK InstallHooks(void)
{
   if (hMouseHook ==0)
   {
      hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, hDllInstance, NULL);
      if(hMouseHook!=NULL)//succesfully installed
      {
         OutputDebugString("Install");
         return TRUE;
      }else
      {
         OutputDebugString("Fehler bei Install");// not installed
         return FALSE;
      }
   }
   return FALSE;
}
//WINVER
BOOL CALLBACK UnInstallHooks(void)
{
    if (UnhookWindowsHookEx(hMouseHook))//succesfully deinstalled
   {
      hMouseHook=NULL;
      OutputDebugString("De_Install");
      return TRUE;
   }else
   {
      OutputDebugString("Fehler bei De_Install");// not deinstalled
      return FALSE;
   }
}

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam,LPARAM lParam)
{
   if(nCode < 0) return CallNextHookEx(hMouseHook, nCode, wParam, lParam); //if not allowed to work ->CallNextHook

   //else:start filtering...

   if (wParam==WM_RBUTTONDOWN)
   {   
      
      //MOUSEHOOKSTRUCT* pMouseStruct = (MOUSEHOOKSTRUCT*)lParam;
      //if (pMouseStructex);
      //x=pMouseStruct->pt.x;
      //x=GET_X_LPARAM(lParam);
      //mouse_event(MOUSEEVENTF_MOVE,50,50,0,0);
      x++;
      sprintf(message,"%d",x);   //convert integer to string
      OutputDebugString(message);
   }
   return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
Hier wird x nicht in einem shared segment gehalten, sondern lokal.
Dadurch kannst Du auch beim testen sehen, das beim klicken auf Programm A von 0 bis 5 gezählt wird ( wenn man 5 mal klickt).
Klickt man nun auf Programm B wird wieder von 0 gezählt ( z.B. von 0 bis 3)
Klick auf Programm A -> 6
Klick auf Programm A ->7
Klick auf Programm B ->4
Klick auf Programm A ->8

usw.
Dadurch habe ich gedacht (und denke es auch immer noch), das hier die Daten in einem lokalen Bereich gehalten werden.

Währe für eine Belehrung überaus dankbar....

[edit=sakura] [delphi]->[c] Tags Mfg, sakura[/edit]
  Mit Zitat antworten Zitat