#PRagma once
#ifndef MSNHOOK_API
#define MSNHOOK_API __declspec(dllimport)
#endif MSNHOOK_API BOOL WINAPI SetMsnHook(DWord dwThreadId);//安裝MSN鉤子函數
MSNHOOK_API void WINAPI GetText(int &x,int &y,char ** ptext);//安裝MSN鉤子函數
MSNHOOK_API HWND WINAPI GetMyHwnd();//安裝MSN鉤子函數
================================================== DLL 的CPP文件 #include "stdafx.h"
#include "MSNHook.h"
#include // 下面幾句的含義是告訴編譯器將各變量放入它自己的數據共享節中 #pragma data_seg("Shared")
HHOOK g_hhook = NULL;
DWORD g_dwThreadIdMsn = 0;
POINT MouseLoc={0,0};
char text[256]={0};
HWND g_Hwnd = NULL;
#pragma data_seg() //告訴編譯器設置共享節的訪問方式為:讀,寫,共享 #pragma comment(linker,"/section:Shared,rws") HINSTANCE g_hinstDll = NULL; BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam); BOOL WINAPI SetMsnHook(DWORD dwThreadId)
{
OutputDebugString("SetMsnHook");
BOOL fOK = FALSE;
if(dwThreadId != 0)
{
OutputDebugString("SetMsnHook dwThreadId != 0");
g_dwThreadIdMsn = GetCurrentThreadId();
//安裝WM_MOUSE鉤子和處理函數GetMsgProc
g_hhook = SetWindowsHookEx(WH_MOUSE,GetMsgProc,g_hinstDll,dwThreadId);
fOK = (g_hhook != NULL);
if(fOK)
{
fOK = PostThreadMessage(dwThreadId,WM_NULL,0,0);
}
else
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
}
return(fOK);
} LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam)
{ char temp[20];
sprintf(temp,"%d/n",nCode);
OutputDebugString("temp");
if (nCode==HC_ACTION)
{
MOUSEHOOKSTRUCT *l=(MOUSEHOOKSTRUCT *)lParam;
MouseLoc=l->pt; //送鼠標位置 //char text[256] = "";
HWND hWnd = WindowFromPoint(l->pt);
if(hWnd)
{
//GetWindowText(hWnd,text,256);
SendMessage(hWnd,WM_GETTEXT,256,(LPARAM)(LPCTSTR)text);
// strcpy(text,"123455555");
SendMessage(hWnd,WM_SETTEXT,256,(LPARAM)(LPCTSTR)text);
g_Hwnd = hWnd;
}
//SendMessage(WindowFromPoint(l->pt),WM_GETTEXT,256,(LPARAM)(LPCTSTR)psw);
} return(CallNextHookEx(g_hhook,nCode,wParam,lParam));
} void WINAPI GetText(int &x,int &y,char ** ptext)
{
x = MouseLoc.x;
y = MouseLoc.y;
*ptext = text;
} HWND WINAPI GetMyHwnd()
{
return g_Hwnd;
}
//包含DLL函數導出的頭文件
#include "MSNHook.h" //隱式導入 #pragma comment(lib,"MSNHook.lib") //聲明導入函數 __declspec(dllimport) BOOL WINAPI SetMsnHook(DWORD dwThreadId);
__declspec(dllimport) void WINAPI GetText(int &x,int &y,char ** ptext);
__declspec(dllimport) HWND WINAPI GetMyHwnd();//安裝MSN鉤子函數
void CTestMSNHookDlg::OnBnClickedOk()
{ //通過SPY++可以看到MSN聊天對話框窗口類是IMWindowClass,通過這個得到該窗口句柄
CWnd *pMsnWin = FindWindow(TEXT("IMWindowClass"),NULL);
if(pMsnWin == NULL) return ; //通過窗口句柄得到對應的線程的ID
SetMsnHook(GetWindowThreadProcessId(pMsnWin->GetSafeHwnd(),NULL));
MSG msg;
GetMessage(&msg,NULL,0,0);
SetTimer(101,100,NULL); } void CTestMSNHookDlg::OnTimer(UINT_PTR nIDEvent)
{ //刷新消息
char * pText = NULL;
int x = 0,y = 0;
GetText(x,y,&pText);
if(x ==0 && y ==0) return ;
m_Edit.Format("%d:%d:%s",x,y,pText);
//m_Edit = pText;
UpdateData(FALSE);
HWND hWnd = GetMyHwnd();
CWnd * pWnd = CWnd::FromHandle(hWnd);
pWnd->GetWindowText(m_Edit);
CDialog::OnTimer(nIDEvent);
} void CTestMSNHookDlg::OnBnClickedButton1()
{ //關閉
KillTimer(101);
SetMsnHook(0);
OnCancel();
}
新聞熱點
疑難解答