小弟我在写MFC共享dll模拟鼠标遇到的有关问题
我在写MFC共享dll模拟鼠标遇到的问题,求助
我希望通过模拟鼠标不断点击来达到完成一些枯燥的工作,然后希望通过按键(R)来终止这个不断点击的过程,但是发现当我按下r时,不是没有效果就是chrome崩溃。
关键代码如下
// ActiveKey.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "ActiveKey.h"
#include "windows.h"
#include "iostream"
#include <afxdllx.h>
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
bool start = false;
void CALLBACK TimerProc()
{
//****************************TODO: ^_^ *****************************
int x[18]={705,436,638};
int y[18]={363,459,425};
//start = !start;
while(start){
for(int i=0;i<3;i++){
SetCursorPos(x[i],y[i]);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
Sleep(500);
}
if(!start)
break;
}
//SetCursorPos(x[2],y[2]);
//mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
//mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
}
extern "C" LRESULT WINAPI
KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) {
if( nCode >= 0 ) {
HANDLE hThread = NULL;
if( wParam == 0X79 )//当按下F10键时,激活外挂。
{ //外挂实现代码。
//SetTimer(NULL,20,10000/*一秒*/,TimerProc/*传递回调函数指针*/);
start = true;
DWORD dwTID = 0;
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimerProc, 0, 0, &dwTID);
} else if(wParam == 0X52) {
//KillTimer(NULL,20);
start = false;
CloseHandle(hThread);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook() {
if( glhHook )
Stop();
} //安装全局钩子。
HHOOK CKeyHook::Start() {
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键 盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop() {
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
return bResult;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{ //如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance; //插入保存DLL实例句柄
} else if (dwReason == DLL_PROCESS_DETACH) {
TRACE0("NotePadHOOK.DLL Terminating!\n"); //终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}
return 1;
}
请各位大牛不吝赐教……ORZ
------解决方案--------------------
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
#pragma comment(linker,"/SECTION:sharedata,RWS")
我希望通过模拟鼠标不断点击来达到完成一些枯燥的工作,然后希望通过按键(R)来终止这个不断点击的过程,但是发现当我按下r时,不是没有效果就是chrome崩溃。
关键代码如下
// ActiveKey.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "ActiveKey.h"
#include "windows.h"
#include "iostream"
#include <afxdllx.h>
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
bool start = false;
void CALLBACK TimerProc()
{
//****************************TODO: ^_^ *****************************
int x[18]={705,436,638};
int y[18]={363,459,425};
//start = !start;
while(start){
for(int i=0;i<3;i++){
SetCursorPos(x[i],y[i]);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
Sleep(500);
}
if(!start)
break;
}
//SetCursorPos(x[2],y[2]);
//mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
//mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
}
extern "C" LRESULT WINAPI
KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) {
if( nCode >= 0 ) {
HANDLE hThread = NULL;
if( wParam == 0X79 )//当按下F10键时,激活外挂。
{ //外挂实现代码。
//SetTimer(NULL,20,10000/*一秒*/,TimerProc/*传递回调函数指针*/);
start = true;
DWORD dwTID = 0;
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimerProc, 0, 0, &dwTID);
} else if(wParam == 0X52) {
//KillTimer(NULL,20);
start = false;
CloseHandle(hThread);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook() {
if( glhHook )
Stop();
} //安装全局钩子。
HHOOK CKeyHook::Start() {
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键 盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop() {
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
return bResult;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{ //如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance; //插入保存DLL实例句柄
} else if (dwReason == DLL_PROCESS_DETACH) {
TRACE0("NotePadHOOK.DLL Terminating!\n"); //终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}
return 1;
}
请各位大牛不吝赐教……ORZ
------解决方案--------------------
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
#pragma comment(linker,"/SECTION:sharedata,RWS")