Prechádzať zdrojové kódy

临时提交:
1、按钮事件。
2、hook 最大最小化。

Jeff 6 rokov pred
rodič
commit
a25c6dab9a

+ 1 - 1
source/hook/WeChats/CWxObject.cpp

@@ -314,7 +314,7 @@ BOOL CWxObject::DetachWxWnd()
 
 		m_bAttached = FALSE;
 #ifdef _DEBUG
-		WriteTextLog(_T("DetachWxWnd"));
+		WriteTextLog(_T("DetachWxWnd£º·ÖÀë΢ÐÅ´°¿Ú"));
 #endif
 	}
 

+ 49 - 6
source/hook/WeChats/WxMgr.cpp

@@ -6,6 +6,7 @@
 TCHAR	CWxMgr::m_szWeChatPath[MAX_PATH] = { 0 };
 CWxMgr::CWxMgr(CWnd *pMainWnd) :m_pMainWnd(pMainWnd)
 {
+	InitButtonIds();
 	GetWeChatPath();
 }
 
@@ -26,6 +27,42 @@ CRect CWxMgr::CalcRect()
 	return rc;
 }
 
+// 获取空闲的id;
+DWORD CWxMgr::GetFreeButtonId(DWORD dwProcId)
+{
+	for (pair<DWORD, DWORD> ids : m_mapIds)
+	{
+		if ( ids.second == 0 )
+		{
+			ids.second = dwProcId;
+			return ids.first;
+		}
+	}
+
+	return -1;
+}
+
+VOID CWxMgr::ReSetButtonKey(DWORD dwProcId)
+{
+	for (pair<DWORD, DWORD> ids : m_mapIds)
+	{
+		if (ids.second == dwProcId)
+		{
+			ids.second = 0;
+			break;
+		}
+	}
+}
+
+void CWxMgr::InitButtonIds()
+{
+	DWORD dwStartId = 10000;
+	for ( int i = 0; i < 10; i++)
+	{
+		m_mapIds.insert(pair<DWORD, DWORD>(dwStartId + i, 0));
+	}
+}
+
 BOOL CWxMgr::AttachUnMgrWxProc(CWnd *pWnd)
 {
 	vector<DWORD> vtWxProcId = FindAllProcess(WECHAT);
@@ -51,17 +88,17 @@ VOID CWxMgr::AddMapItem(DWORD dwProcId, LPCTSTR lpItemName)
 	// 创建微信对象;
 	wxObjInfo.pWxObject = new CWxObject(dwProcId, g_szDynamicLibraryPath);
 
-	// 创建按钮;
+	// 创建按钮;//id使用自建的;
 	wxObjInfo.pWxButton = new CButtonST();
-	wxObjInfo.pWxButton->Create(lpItemName, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, CalcRect(), m_pMainWnd, dwProcId);
+	wxObjInfo.pWxButton->Create(lpItemName, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, CalcRect(), m_pMainWnd, GetFreeButtonId(dwProcId));
 	wxObjInfo.pWxButton->OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 60);
 	//wxObjInfo.pWxButton->DrawTransparent();
 	wxObjInfo.pWxButton->SetIcon(ICON_CHECK);
 	wxObjInfo.pWxButton->ShowWindow(SW_SHOW);
 
-	// 创建聊天窗口;
+	// 创建聊天窗口;//Id使用进程id;
 	wxObjInfo.pWxChatWnd = new CStatic();
-	wxObjInfo.pWxChatWnd->Create(lpItemName, WS_CHILD | WS_VISIBLE | WS_TABSTOP | SS_GRAYRECT, m_rcWxShow, m_pMainWnd, dwProcId + 1);
+	wxObjInfo.pWxChatWnd->Create(lpItemName, WS_CHILD | WS_VISIBLE | WS_TABSTOP | SS_GRAYRECT, m_rcWxShow, m_pMainWnd, dwProcId);
 	wxObjInfo.pWxChatWnd->ShowWindow(SW_SHOW);
 
 	// 附加到窗口;
@@ -88,6 +125,8 @@ VOID CWxMgr::RemoveMapItem(DWORD dwProcId)
 			delete wxinfo.second.pWxObject;
 			delete wxinfo.second.pWxButton;
 			delete wxinfo.second.pWxChatWnd;
+			// 重转按钮关联的进程id;
+			ReSetButtonKey(dwProcId);
 			// 下方的WxButton向上移动;
 			// ...
 			break;
@@ -106,6 +145,10 @@ VOID CWxMgr::DetachAllWxProc()
 		delete wxinfo.second.pWxObject;
 		delete wxinfo.second.pWxButton;
 		delete wxinfo.second.pWxChatWnd;
+		// 重转按钮关联的进程id;
+		ReSetButtonKey(wxinfo.first);
+		// 下方的WxButton向上移动;
+		// ...
 	}
 
 	m_mapWx.clear();
@@ -139,9 +182,9 @@ BOOL CWxMgr::OpenWeChat()
 
 	if (bRet)
 	{
-		/*WaitForSingleObject(pi.hProcess, INFINITE);*/
+		//WaitForSingleObject(pi.hProcess, INFINITE);
 		//WaitForInputIdle(pi.hProcess, INFINITE);
-		Sleep(1500); // 启动微信需要1秒左右;
+		//Sleep(1500); // 启动微信需要1秒左右;
 		// 既然我们不使用两个句柄,最好是立刻将它们关闭
 		::CloseHandle(pi.hThread);
 		::CloseHandle(pi.hProcess);

+ 8 - 0
source/hook/WeChats/WxMgr.h

@@ -30,6 +30,14 @@ private:
 	CRect CalcRect();
 	// ΢ÐÅ·¾¶;
 	static TCHAR	m_szWeChatPath[MAX_PATH];
+
+public:
+	DWORD GetFreeButtonId(DWORD dwProcId);
+	VOID ReSetButtonKey(DWORD dwProcId);
+	void InitButtonIds();
+	// °´Å¥ID<°´Å¥Id,½ø³ÌID>
+	std::map<DWORD, DWORD> m_mapIds;
+
 public:
 	VOID SetMainWnd(CWnd *pWnd, CRect rcWxList, CRect rcWxShow) {
 		m_pMainWnd = pWnd;

+ 29 - 0
source/hook/hook/WxGlobal.cpp

@@ -8,6 +8,8 @@
 using namespace std;
 #include <psapi.h>
 #pragma comment(lib,"Psapi.lib")
+// 进程相关头文件;
+#include <TlHelp32.h>
 
 #include "EncodingConversion.h"
 
@@ -208,3 +210,30 @@ BOOL GetWxInfo(WxInfo &wxInfo)
 
 	return TRUE;
 }
+
+BOOL GetProcInfo(DWORD &dwThreadId)
+{
+	DWORD dwMID = 0;
+	THREADENTRY32 the32 = { 0 };
+	DWORD dwProcId = ::GetCurrentProcessId();
+	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, dwProcId);
+	if (hSnapshot == NULL)
+		return FALSE;
+
+	BOOL bRet = FALSE;
+	the32.dwSize = sizeof(THREADENTRY32);
+	// 注意:第一次找到的线程ID就是主线程ID;
+ 	for ( bRet = Thread32First(hSnapshot, &the32); bRet == TRUE; bRet = Thread32Next(hSnapshot, &the32) )
+	{
+		if ( the32.th32OwnerProcessID == dwProcId )
+		{
+			dwThreadId = the32.th32ThreadID;
+			WriteTextLog(_T("Thread32 进程ID=%ld, 进程ID=%d, 线程ID=%d, Boolean=%d"), the32.th32OwnerProcessID, dwProcId, the32.th32ThreadID, bRet);
+			break;
+		}
+	}
+ 	
+	CloseHandle(hSnapshot);
+
+	return bRet;
+}

+ 1 - 1
source/hook/hook/WxGlobal.h

@@ -137,5 +137,5 @@ extern HMODULE g_hCurModule;
 extern void WriteTextLog(const TCHAR *format, ...);
 extern void WriteTextLogW(const WCHAR *format, ...);
 extern BOOL GetWxInfo(WxInfo &wxInfo);
-
+extern BOOL GetProcInfo(DWORD &dwThreadId);
 #endif

+ 12 - 2
source/hook/hook/dllmain.cpp

@@ -4,6 +4,7 @@
 HHOOK g_hook = NULL;
 LRESULT CALLBACK Hook_CBT_Proc(int nCode, WPARAM wParam, LPARAM lParam)
 {
+	WriteTextLog(_T("窗口HCBT_XXX"));
 	tagMSG* msg;
 	msg = (tagMSG*)lParam;
 	if (nCode == HCBT_MINMAX)
@@ -25,9 +26,18 @@ BOOL APIENTRY DllMain(HMODULE hModule,
 	{
 	case DLL_PROCESS_ATTACH:
 	{
+		DWORD dwThreadId = 0;
+		GetProcInfo(dwThreadId);
 		if (g_hook == NULL)
-			g_hook = SetWindowsHookEx(WH_CBT, Hook_CBT_Proc, NULL, ::GetCurrentThreadId());
-		WriteTextLog(_T("dll已成功注入:%d,%d"), ::GetCurrentThreadId(), ::GetCurrentProcessId());
+		{
+			g_hook = SetWindowsHookEx(WH_CBT, Hook_CBT_Proc, NULL, dwThreadId);
+			if (g_hook == NULL)
+				WriteTextLog(_T("hook api失败"));
+			else
+				WriteTextLog(_T("hook api成功"));
+		}
+
+		WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 进程id=%d】"), ::GetCurrentThreadId(), ::GetCurrentProcessId());
 		WxInfo wxInfo;
 		GetWxInfo(wxInfo);
 	}