我的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;
}
就計數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;
}
解决方案 »
- 调用DLL中,调用DLL中的类函数无法解析//怎么解决!!!
- 无法在自己电脑上重现的bug怎么解决?
- VC程序员之无法选择的命运
- 我在做图象处理的放大功能的时候,有没有人做过定时刷屏的?
- 怎样使用winsock i/o多路复用??????
- 100份求教,如何用用vc实现在网页上绘制直线等图形的功能(类似imarkup的功能)?
- 写xml文件的不完整的问题
- 关于《深度探索C++模型》的问题,望大虾不吝指教
- 一个菜鸟的问题!ASCII和UNICODE的代码。例如0xD7、0x0080……,前面的0x是什么意思啊?
- 在用CDib类的时候,其中有一行#define MEMORY_MAPPED_FILES宏定义好象是在内存中建立一映射文件,但我不是十分的清楚。如果是,它又是怎样做的呢?
- 怎样编界面
- 作图:一道数学(解析几何)题
#pragma data_seg(".SHARDAT")
static int iCount;
#pragma data_seg()
iCount用来保存mouse点击数,当程序运行,在不同窗口中按下了鼠标键,由于设置了鼠标钩子,系统会调用DLL中的钩子处理函数截获消息并加以处理,即把点击数保存到icount中以备将来显示之用。如果不把icount放到一个共享的数据段里,系统就会在目前我们截获鼠标消息的窗口的进程的地址空间里开辟icount,这样对于其他进程就不能得到这个进程存入icount的数据了。这时只能将icount等需要跨进程访问的变量数据放在一个共享的数据段里了。另外,需要特别注意——必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。
麻煩大俠再幫忙看一下,好嗎?謝謝了!!
// 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()
給分了..