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