int *getmousespeed=new int[1];SystemParametersInfo(112,0,(PVOID)getmousespeed,0); *getmousespeed=1; SystemParametersInfo(113,0,(PVOID)getmousespeed,0);我调用SystemParametersInfo用参数112读取鼠标速度时正确,得到默认值10, 但当我用参数113设置鼠标速度时却变化。 注:SPI_GETMOUSESPEED=112, SPI_SETMOUSESPEED=113 我在程序中包含了“winuser.h"后,compile时仍然不认此两个系统常量,不知原因。
#include "stdafx.h" #include <afxdllx.h> #include "mousehook.h"#pragma data_seg("mydata") HWND glhPrevTarWnd=NULL; HWND glhDisplayWnd=NULL; HHOOK glhHook=NULL; HINSTANCE glhInstance=NULL; #pragma data_seg() #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static AFX_EXTENSION_MODULE MousehookDLL = { NULL, NULL };extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { // Remove this if you use lpReserved UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("MOUSEHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization if (!AfxInitExtensionModule(MousehookDLL, hInstance)) return 0; // Insert this DLL into the resource chain // NOTE: If this Extension DLL is being implicitly linked to by // an MFC Regular DLL (such as an ActiveX Control) // instead of an MFC application, then you will want to // remove this line from DllMain and put it in a separate // function exported from this Extension DLL. The Regular DLL // that uses this Extension DLL should then explicitly call that // function to initialize this Extension DLL. Otherwise, // the CDynLinkLibrary object will not be attached to the // Regular DLL's resource chain, and serious problems will // result. new CDynLinkLibrary(MousehookDLL); glhInstance=hInstance; } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("MOUSEHOOK.DLL Terminating!\n"); // Terminate the library before destructors are called AfxTermExtensionModule(MousehookDLL); } return 1; // ok }CMouseHook::CMouseHook() { } CMouseHook::~CMouseHook() { StopHook(); } LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; int *Getmousespeed=new int[1]; char *p=new char[4],*q=new char[4]; SystemParametersInfo(112,0,(PVOID)Getmousespeed,0); itoa(*Getmousespeed,p,10); *Getmousespeed=1; SystemParametersInfo(113,0,(PVOID)Getmousespeed,0); itoa(*Getmousespeed,q,10); if (nCode>=0) { HWND glhTargetWnd=pMouseHook->hwnd; HWND ParentWnd=glhTargetWnd; while (ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); } if(glhTargetWnd!=glhPrevTarWnd) { char szCaption[100];
*getmousespeed=1;
SystemParametersInfo(113,0,(PVOID)getmousespeed,0);我调用SystemParametersInfo用参数112读取鼠标速度时正确,得到默认值10,
但当我用参数113设置鼠标速度时却变化。
注:SPI_GETMOUSESPEED=112, SPI_SETMOUSESPEED=113
我在程序中包含了“winuser.h"后,compile时仍然不认此两个系统常量,不知原因。
#include <afxdllx.h>
#include "mousehook.h"#pragma data_seg("mydata")
HWND glhPrevTarWnd=NULL;
HWND glhDisplayWnd=NULL;
HHOOK glhHook=NULL;
HINSTANCE glhInstance=NULL;
#pragma data_seg()
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE MousehookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("MOUSEHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(MousehookDLL, hInstance))
return 0; // Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result. new CDynLinkLibrary(MousehookDLL);
glhInstance=hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(MousehookDLL);
}
return 1; // ok
}CMouseHook::CMouseHook()
{
} CMouseHook::~CMouseHook()
{
StopHook();
} LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
int *Getmousespeed=new int[1];
char *p=new char[4],*q=new char[4];
SystemParametersInfo(112,0,(PVOID)Getmousespeed,0);
itoa(*Getmousespeed,p,10);
*Getmousespeed=1;
SystemParametersInfo(113,0,(PVOID)Getmousespeed,0);
itoa(*Getmousespeed,q,10); if (nCode>=0)
{
HWND glhTargetWnd=pMouseHook->hwnd; HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd); }
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
GetWindowText(glhTargetWnd,szCaption,100);
strcat(szCaption,strcat(strcat(p," "),q));
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd; }
}
delete Getmousespeed;
delete p;
delete q;
return CallNextHookEx(glhHook,nCode,wparam,lparam); } BOOL CMouseHook::StartHook(HWND hWnd) {
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
glhDisplayWnd=hWnd;
return bResult;
} BOOL CMouseHook::StopHook()
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;
glhHook=NULL;
}
}
return bResult;
}
SystemParametersInfo(112,0,(PVOID)Getmousespeed,0);
读出鼠标速度信息后,速度与设定前一样,问题出在那儿?我的OS是WIN2000SERVER