我写了一个查找窗口的dll,根据参数传入窗口的名字,但有下面的问题:
static TCHAR wndName[MAX_SIZE];
void FindWnd(TCHAR str[MAX_SIZE])
{
strcpy(wndName,str);
wndShook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)hook,NULL);
wndmsghook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,(HINSTANCE) Dllhook,NULL);
}
static LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
switch (nCode)
{
case HCBT_ACTIVATE:
EnumWindows(EnumWindowsProc,0);
break;
}
return CallNextHookEx(RTGShook,nCode,wParam,lParam);
}
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR wndTitle[MAX_SIZE];
GetWindowText(hwnd,wndTitle,MAX_SIZE);
if (!strcmp(wndTitle,wndName))
{
..............................
return FALSE;
}return TRUE;
}
strcmp(wndTitle,wndName)这句永远都不成功,我曾跟踪过发现wndName的值并不是我最初送的值,而是空的,这是为什么呢?
请各位大虾帮我解答一下。
static TCHAR wndName[MAX_SIZE];
void FindWnd(TCHAR str[MAX_SIZE])
{
strcpy(wndName,str);
wndShook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)hook,NULL);
wndmsghook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,(HINSTANCE) Dllhook,NULL);
}
static LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
switch (nCode)
{
case HCBT_ACTIVATE:
EnumWindows(EnumWindowsProc,0);
break;
}
return CallNextHookEx(RTGShook,nCode,wParam,lParam);
}
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR wndTitle[MAX_SIZE];
GetWindowText(hwnd,wndTitle,MAX_SIZE);
if (!strcmp(wndTitle,wndName))
{
..............................
return FALSE;
}return TRUE;
}
strcmp(wndTitle,wndName)这句永远都不成功,我曾跟踪过发现wndName的值并不是我最初送的值,而是空的,这是为什么呢?
请各位大虾帮我解答一下。
FindWnd函数是位于进程A中,而两个Callback函数是位于进程B中。因此尽管你使用的是一个全局变量,但是这个全局变量在进程A和B中各有一个实例,因此无法传值。
设置成共享数据端?
因为FindWnd函数处理的是位于调用FindWnd函数的进程内的DLL的全局变量。
而钩子里面处理的是加载到另一个进程内的DLL的全局变量。有可能两个DLL都加载到了进程的同一基址上,这时两个变量虚拟地址相同,但是实际上指向不同的物理存储页面,Window加载DLL会保证这一点。不过你可以在编译时指定需要在不同进程间共享的全局变量;#pragma data_seg("Shared") //可以是任意名字
static TCHAR wndName[MAX_SIZE];
#pragma data_seg()__declspec(allocate("Shared")) static TCHAR wndName = { 0 };#pragma comment(linker,"/SECTION:Shared,RWS")
你是怎么赋值的?