#include "stdafx.h"
#define WM_MYPOS WM_USER+10000
HINSTANCE hmod;
HHOOK hhk;
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hmod=(HINSTANCE)hModule;
return TRUE;
}HWND hWnd;
extern "C" __declspec(dllexport) int InstallHook(HWND hwnd)
{
hWnd=hwnd;
hhk=SetWindowsHookEx(WH_MOUSE,MouseProc,hmod,0);
return 0;
}LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{ MOUSEHOOKSTRUCT *mhs=(MOUSEHOOKSTRUCT *)lParam;
SendMessage(hWnd,WM_MYPOS,mhs->pt.x,mhs->pt.y);
return CallNextHookEx(hhk,nCode,wParam,lParam);
}
////////////////////////////////////////
typedef int (* proc)(HWND);
void CDlltestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HINSTANCE hlib;
proc InstallHook;
hlib=LoadLibrary("DllFunc");
InstallHook=(proc)GetProcAddress(hlib,"InstallHook");
HWND hwnd;
hwnd=GetSafeHwnd();
InstallHook(hwnd);
}void CDlltestDlg::OnMyPos(WPARAM wp,LPARAM lp)
{
m_x=wp;
m_y=lp;
UpdateData(false);
}
#define WM_MYPOS WM_USER+10000
HINSTANCE hmod;
HHOOK hhk;
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hmod=(HINSTANCE)hModule;
return TRUE;
}HWND hWnd;
extern "C" __declspec(dllexport) int InstallHook(HWND hwnd)
{
hWnd=hwnd;
hhk=SetWindowsHookEx(WH_MOUSE,MouseProc,hmod,0);
return 0;
}LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{ MOUSEHOOKSTRUCT *mhs=(MOUSEHOOKSTRUCT *)lParam;
SendMessage(hWnd,WM_MYPOS,mhs->pt.x,mhs->pt.y);
return CallNextHookEx(hhk,nCode,wParam,lParam);
}
////////////////////////////////////////
typedef int (* proc)(HWND);
void CDlltestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HINSTANCE hlib;
proc InstallHook;
hlib=LoadLibrary("DllFunc");
InstallHook=(proc)GetProcAddress(hlib,"InstallHook");
HWND hwnd;
hwnd=GetSafeHwnd();
InstallHook(hwnd);
}void CDlltestDlg::OnMyPos(WPARAM wp,LPARAM lp)
{
m_x=wp;
m_y=lp;
UpdateData(false);
}
你現在用的就是全局勾子﹐但是当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。 try something like:
#pragma data_seg ("shareddata") HINSTANCE hmod = NULL;
HHOOK hhk = NULL; //共享数据 #pragma data_seg() 在.DEF文件中加入如下语句:
SETCTIONS
shareddata READ WRITE SHARED good luck
在你的程序中有﹕
HWND hWnd; // 我不是很理解這個變量。在你給出的代碼裡不必要。
// if i am wrong, correct me please.
extern "C" __declspec(dllexport) int InstallHook(HWND hwnd)
{
hWnd=hwnd;
hhk=SetWindowsHookEx(WH_MOUSE,MouseProc,hmod,0);
return 0;
}
HHOOK hhk = NULL; //共享数据
#pragma data_seg() 这样OK了
在你的程序中有﹕
HWND hWnd; // 我不是很理解這個變量。在你給出的代碼裡不必要。
我在钩子函数中,SendMessage(hWnd,....),钩子函数也在dll中
好像还是不行
#pragma data_seg ("shareddata")
//HHOOK hhk = NULL; //共享数据
HWND hWnd;
HHOOK hhk;
#pragma data_seg()
就行了吗
//HHOOK hhk = NULL; //共享数据
HWND hWnd=NULL;
HHOOK hhk=NULL;
#pragma data_seg() 要赋初值!
连你都没看出问题来
static char szLinkDirectiveShared[] = "-section:Shared,rws";
#pragma data_seg()
#pragma data_seg("Shared")HHOOK g_hhook = NULL;
HWND g_hwndPost = NULL;
UINT g_uMsgNotify = WM_USER;#pragma data_seg()
http://vip.6to23.com/NowCan1/code/kbdtrc.zip