fix: #56 Do not operate UI in working threads

This commit is contained in:
yuanyuanxiang
2025-02-25 03:43:15 +08:00
parent 269707b0d2
commit ac2d54a706
4 changed files with 70 additions and 133 deletions

View File

@@ -26,10 +26,6 @@
#define UM_ICONNOTIFY WM_USER+100 #define UM_ICONNOTIFY WM_USER+100
// <20>ļ<EFBFBD><C4BC>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3A8>Ϊ<EFBFBD><CEAA><EFBFBD>׵<EFBFBD><D7B5>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2>ԣ<EFBFBD>
std::vector<CFileManagerDlg *> v_FileDlg;
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3A8>Ϊ<EFBFBD><CEAA><EFBFBD>׵<EFBFBD><D7B5>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2>ԣ<EFBFBD>
std::vector<CRegisterDlg *> v_RegDlg;
enum enum
{ {
@@ -186,6 +182,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
ON_MESSAGE(WM_OPENSERVICESDIALOG, OnOpenServicesDialog) ON_MESSAGE(WM_OPENSERVICESDIALOG, OnOpenServicesDialog)
ON_MESSAGE(WM_OPENREGISTERDIALOG, OnOpenRegisterDialog) ON_MESSAGE(WM_OPENREGISTERDIALOG, OnOpenRegisterDialog)
ON_MESSAGE(WM_OPENWEBCAMDIALOG, OnOpenVideoDialog) ON_MESSAGE(WM_OPENWEBCAMDIALOG, OnOpenVideoDialog)
ON_MESSAGE(WM_HANDLEMESSAGE, OnHandleMessage)
ON_WM_HELPINFO() ON_WM_HELPINFO()
END_MESSAGE_MAP() END_MESSAGE_MAP()
@@ -246,7 +243,6 @@ VOID CMy2015RemoteDlg::CreatStatusBar()
VOID CMy2015RemoteDlg::CreateNotifyBar() VOID CMy2015RemoteDlg::CreateNotifyBar()
{ {
#if INDEPENDENT
m_Nid.cbSize = sizeof(NOTIFYICONDATA); //<2F><>С<EFBFBD><D0A1>ֵ m_Nid.cbSize = sizeof(NOTIFYICONDATA); //<2F><>С<EFBFBD><D0A1>ֵ
m_Nid.hWnd = m_hWnd; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>CWnd<6E><64><EFBFBD><EFBFBD> m_Nid.hWnd = m_hWnd; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>CWnd<6E><64><EFBFBD><EFBFBD>
m_Nid.uID = IDR_MAINFRAME; //icon ID m_Nid.uID = IDR_MAINFRAME; //icon ID
@@ -256,7 +252,6 @@ VOID CMy2015RemoteDlg::CreateNotifyBar()
CString strTips ="<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Զ<><D4B6>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ CString strTips ="<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Զ<><D4B6>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
lstrcpyn(m_Nid.szTip, (LPCSTR)strTips, sizeof(m_Nid.szTip) / sizeof(m_Nid.szTip[0])); lstrcpyn(m_Nid.szTip, (LPCSTR)strTips, sizeof(m_Nid.szTip) / sizeof(m_Nid.szTip[0]));
Shell_NotifyIcon(NIM_ADD, &m_Nid); //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> Shell_NotifyIcon(NIM_ADD, &m_Nid); //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
#endif
} }
VOID CMy2015RemoteDlg::CreateToolBar() VOID CMy2015RemoteDlg::CreateToolBar()
@@ -438,10 +433,6 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
return FALSE; return FALSE;
} }
#if !INDEPENDENT
ShowWindow(SW_SHOW);
#endif
timeBeginPeriod(1); timeBeginPeriod(1);
return TRUE; // <20><><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> TRUE return TRUE; // <20><><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> TRUE
@@ -454,12 +445,6 @@ void CMy2015RemoteDlg::OnSysCommand(UINT nID, LPARAM lParam)
CAboutDlg dlgAbout; CAboutDlg dlgAbout;
dlgAbout.DoModal(); dlgAbout.DoModal();
} }
#if !INDEPENDENT
else if(nID == SC_CLOSE || nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
}
#endif
else else
{ {
CDialogEx::OnSysCommand(nID, lParam); CDialogEx::OnSysCommand(nID, lParam);
@@ -585,9 +570,8 @@ void CMy2015RemoteDlg::Release(){
OutputDebugStringA("======> Release\n"); OutputDebugStringA("======> Release\n");
isClosed = TRUE; isClosed = TRUE;
ShowWindow(SW_HIDE); ShowWindow(SW_HIDE);
#if INDEPENDENT
Shell_NotifyIcon(NIM_DELETE, &m_Nid); Shell_NotifyIcon(NIM_DELETE, &m_Nid);
#endif
BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT; BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT;
EnterCriticalSection(&m_cs); EnterCriticalSection(&m_cs);
@@ -600,32 +584,6 @@ void CMy2015RemoteDlg::Release(){
LeaveCriticalSection(&m_cs); LeaveCriticalSection(&m_cs);
Sleep(200); Sleep(200);
EnterCriticalSection(&m_cs);
/*
for (std::vector<CFileManagerDlg *>::iterator iter = v_FileDlg.begin();
iter != v_FileDlg.end(); ++iter)
{
CFileManagerDlg *cur = *iter;
::SendMessage(cur->GetSafeHwnd(), WM_CLOSE, 0, 0);
while (false == cur->m_bIsClosed)
Sleep(1);
delete cur;
}
*/
for (std::vector<CRegisterDlg *>::iterator iter = v_RegDlg.begin();
iter != v_RegDlg.end(); ++iter)
{
CRegisterDlg *cur = *iter;
::SendMessage(cur->GetSafeHwnd(), WM_CLOSE, 0, 0);
while (false == cur->m_bIsClosed)
Sleep(1);
delete cur;
}
LeaveCriticalSection(&m_cs);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sleep<65><70><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><E2B2BB><EFBFBD>˳<EFBFBD>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IOCP<43><50>Ҫ<EFBFBD><D2AA><EFBFBD>ظ<EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD>
Sleep(300);
if (m_iocpServer!=NULL) if (m_iocpServer!=NULL)
{ {
delete m_iocpServer; delete m_iocpServer;
@@ -820,13 +778,8 @@ VOID CMy2015RemoteDlg::OnOnlineDesktopManager()
VOID CMy2015RemoteDlg::OnOnlineFileManager() VOID CMy2015RemoteDlg::OnOnlineFileManager()
{ {
#if INDEPENDENT
BYTE bToken = COMMAND_LIST_DRIVE; BYTE bToken = COMMAND_LIST_DRIVE;
SendSelectedCommand(&bToken, sizeof(BYTE)); SendSelectedCommand(&bToken, sizeof(BYTE));
#else
if(m_CList_Online.GetFirstSelectedItemPosition())
ShowMessage(FALSE, "<EFBFBD>˹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣʹ<EFBFBD><EFBFBD>");
#endif
} }
VOID CMy2015RemoteDlg::OnOnlineAudioManager() VOID CMy2015RemoteDlg::OnOnlineAudioManager()
@@ -963,7 +916,60 @@ BOOL CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject)
{ {
AUTO_TICK(20); AUTO_TICK(20);
MessageHandle(ContextObject);
switch (ContextObject->v1)
{
case VIDEO_DLG:
{
CVideoDlg* Dlg = (CVideoDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SERVICES_DLG:
{
CServicesDlg* Dlg = (CServicesDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case AUDIO_DLG:
{
CAudioDlg* Dlg = (CAudioDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SYSTEM_DLG:
{
CSystemDlg* Dlg = (CSystemDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SHELL_DLG:
{
CShellDlg* Dlg = (CShellDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SCREENSPY_DLG:
{
CScreenSpyDlg* Dlg = (CScreenSpyDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case FILEMANAGER_DLG:
{
CFileManagerDlg* Dlg = (CFileManagerDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case REGISTER_DLG:
{
CRegisterDlg* Dlg = (CRegisterDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
default:
g_2015RemoteDlg->PostMessage(WM_HANDLEMESSAGE, (WPARAM)ContextObject, (LPARAM)ContextObject);
}
} }
// <20>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -986,64 +992,15 @@ VOID CALLBACK CMy2015RemoteDlg::OfflineProc(CONTEXT_OBJECT* ContextObject)
} }
LRESULT CMy2015RemoteDlg::OnHandleMessage(WPARAM wParam, LPARAM lParam) {
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam;
MessageHandle(ContextObject);
return S_OK;
}
VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
{ {
if (ContextObject->v1 > 0)
{
switch(ContextObject->v1)
{
case VIDEO_DLG:
{
CVideoDlg *Dlg = (CVideoDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SERVICES_DLG:
{
CServicesDlg *Dlg = (CServicesDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case AUDIO_DLG:
{
CAudioDlg *Dlg = (CAudioDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SYSTEM_DLG:
{
CSystemDlg *Dlg = (CSystemDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SHELL_DLG:
{
CShellDlg *Dlg = (CShellDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case SCREENSPY_DLG:
{
CScreenSpyDlg *Dlg = (CScreenSpyDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case FILEMANAGER_DLG:
{
CFileManagerDlg *Dlg = (CFileManagerDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
case REGISTER_DLG:
{
CRegisterDlg *Dlg = (CRegisterDlg*)ContextObject->hDlg;
Dlg->OnReceiveComplete();
break;
}
}
return;
}
switch (ContextObject->InDeCompressedBuffer.GetBYTE(0)) switch (ContextObject->InDeCompressedBuffer.GetBYTE(0))
{ {
case COMMAND_BYE: case COMMAND_BYE:
@@ -1242,7 +1199,7 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam)
case REGISTER_DLG: case REGISTER_DLG:
{ {
CRegisterDlg *Dlg = (CRegisterDlg*)p->hDlg; CRegisterDlg *Dlg = (CRegisterDlg*)p->hDlg;
//delete Dlg; //<2F><><EFBFBD><EFBFBD><E2B4A6> delete Dlg; //<2F><><EFBFBD><EFBFBD><E2B4A6>
break; break;
} }
default:break; default:break;
@@ -1395,21 +1352,6 @@ LRESULT CMy2015RemoteDlg::OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam)
ContextObject->v1 = REGISTER_DLG; ContextObject->v1 = REGISTER_DLG;
ContextObject->hDlg = Dlg; ContextObject->hDlg = Dlg;
EnterCriticalSection(&m_cs);
for (std::vector<CRegisterDlg *>::iterator iter = v_RegDlg.begin();
iter != v_RegDlg.end(); )
{
CRegisterDlg *cur = *iter;
if (cur->m_bIsClosed)
{
delete cur;
iter = v_RegDlg.erase(iter);
}else{
++iter;
}
}
v_RegDlg.push_back(Dlg);
LeaveCriticalSection(&m_cs);
return 0; return 0;
} }

View File

@@ -10,16 +10,8 @@
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
#define INDEPENDENT 1
//////////////////////////////////////////////////////////////////////////
#if INDEPENDENT
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ض<EFBFBD>ʱҲ<CAB1>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD> // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ض<EFBFBD>ʱҲ<CAB1>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
#define CLIENT_EXIT_WITH_SERVER 0 #define CLIENT_EXIT_WITH_SERVER 0
#else
#define CLIENT_EXIT_WITH_SERVER 1
#endif
// CMy2015RemoteDlg <20>Ի<EFBFBD><D4BB><EFBFBD> // CMy2015RemoteDlg <20>Ի<EFBFBD><D4BB><EFBFBD>
class CMy2015RemoteDlg : public CDialogEx class CMy2015RemoteDlg : public CDialogEx
@@ -61,7 +53,7 @@ public:
static VOID CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject); static VOID CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject);
static VOID CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject); static VOID CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject);
static VOID MessageHandle(CONTEXT_OBJECT* ContextObject); VOID MessageHandle(CONTEXT_OBJECT* ContextObject);
VOID SendSelectedCommand(PBYTE szBuffer, ULONG ulLength); VOID SendSelectedCommand(PBYTE szBuffer, ULONG ulLength);
// <20><>ʾ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ // <20><>ʾ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
CListCtrl m_CList_Online; CListCtrl m_CList_Online;
@@ -69,9 +61,9 @@ public:
CStatusBar m_StatusBar; //״̬<D7B4><CCAC> CStatusBar m_StatusBar; //״̬<D7B4><CCAC>
CTrueColorToolBar m_ToolBar; CTrueColorToolBar m_ToolBar;
#if INDEPENDENT
NOTIFYICONDATA m_Nid; NOTIFYICONDATA m_Nid;
#endif
CRITICAL_SECTION m_cs; CRITICAL_SECTION m_cs;
BOOL isClosed; BOOL isClosed;
@@ -111,6 +103,7 @@ public:
afx_msg LRESULT OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOpenServicesDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenServicesDialog(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOpenVideoDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenVideoDialog(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnHandleMessage(WPARAM wParam, LPARAM lParam);
afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);
virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL PreTranslateMessage(MSG* pMsg);
}; };

View File

@@ -187,6 +187,7 @@ BOOL CBuildDlg::OnInitDialog()
m_ComboEncrypt.InsertString(0, "<EFBFBD><EFBFBD>"); m_ComboEncrypt.InsertString(0, "<EFBFBD><EFBFBD>");
m_ComboEncrypt.InsertString(1, "XOR"); m_ComboEncrypt.InsertString(1, "XOR");
m_ComboEncrypt.SetCurSel(0); m_ComboEncrypt.SetCurSel(0);
m_ComboEncrypt.EnableWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
// <20>쳣: OCX <20><><EFBFBD><EFBFBD>ҳӦ<D2B3><D3A6><EFBFBD><EFBFBD> FALSE // <20>쳣: OCX <20><><EFBFBD><EFBFBD>ҳӦ<D2B3><D3A6><EFBFBD><EFBFBD> FALSE

View File

@@ -90,6 +90,7 @@
#define WM_OPENWEBCAMDIALOG WM_USER+3009 #define WM_OPENWEBCAMDIALOG WM_USER+3009
#define WM_USEROFFLINEMSG WM_USER+3010 #define WM_USEROFFLINEMSG WM_USER+3010
#define WM_HANDLEMESSAGE WM_USER+3011
enum enum
{ {