我的mouse hook程式的功能是每當mouse點擊一次,就計數一次(iCount=1),點擊兩次,
就計數2次(iCount=2),但是我的程式在點擊的時候在第一個窗口可以計數正常,但是在第二個窗口的時候卻又會重新開始計數,顯示又從0開始,如果再點擊第一個窗口,那么第一個窗口的計數又會正常從上一次的計數向后累加計數,為什么會這樣呢?
程式如下:
#include "stdafx.h"
#include "LaunchDLL.h"#ifdef _DEBUG
#define new DEBUG_NEW_DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
char count[255];
int iCount;
int iLength;
BEGIN_MESSAGE_MAP(CLaunchDLLApp, CWinApp)
END_MESSAGE_MAP()CLaunchDLLApp::CLaunchDLLApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}CLaunchDLLApp theApp;
HHOOK Hook; 
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam); 
void SaveLog(char* c); 
DllExport void WINAPI InstallLaunchEv() 

  Hook=(HHOOK)SetWindowsHookEx(WH_MOUSE, 
  (HOOKPROC)LauncherHook, 
  theApp.m_hInstance, 
  0); 

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) 
{
  LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); 
  if(nCode==HC_ACTION) 
  { 
if(wParam==WM_LBUTTONDOWN)
// AfxMessageBox("WM_RBUTTONDOWN");
iCount++;
//GetDC(NULL);
memset(count,0,255);
sprintf(count,"%d",iCount);
iLength=strlen(count);
::TextOut(GetDC(NULL),100,100,"TestTimes",9);
::TextOut(GetDC(NULL),200,100,count,iLength);} 
  return Result; 
}

解决方案 »

  1.   

    try this way:
    #pragma data_seg(".SHARDAT")
    static int iCount;
    #pragma data_seg()
      

  2.   

    DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。“DLL在WIN32中什么都不拥有”——这句话很重要。比如我们在DLL里建立了一个变量a,而我们的这个DLL文件又被两个进程所调用,这两个进程的中都用到了a可这绝对是两个不同存储单元中存储的两个a,它们之间没有丝毫的联系。给其中一个赋值也绝对不会影响到另一个。
    iCount用来保存mouse点击数,当程序运行,在不同窗口中按下了鼠标键,由于设置了鼠标钩子,系统会调用DLL中的钩子处理函数截获消息并加以处理,即把点击数保存到icount中以备将来显示之用。如果不把icount放到一个共享的数据段里,系统就会在目前我们截获鼠标消息的窗口的进程的地址空间里开辟icount,这样对于其他进程就不能得到这个进程存入icount的数据了。这时只能将icount等需要跨进程访问的变量数据放在一个共享的数据段里了。另外,需要特别注意——必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。
      

  3.   

    我加在這里行嗎?是不是加錯位置了?怎么還是這樣呢?
    麻煩大俠再幫忙看一下,好嗎?謝謝了!!
    // LaunchDLL.cpp : Defines the initialization routines for the DLL.
    //#include "stdafx.h"
    #include "LaunchDLL.h"#ifdef _DEBUG
    #define new DEBUG_NEW_DEBUG
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    //char count[255];
    //int iCount;
    int iLength;#pragma data_seg(".SHARDAT")
    static int iCount;
    static char count[255];
    #pragma data_seg()
      

  4.   

    已經ok了,thanks!
     給分了..