unsigned __stdcall HideWindowProc(void * pParam) { //dbview(L"enter HideWindowProc........................................"); DWORD dwErr = 0; BOOL bRet = FALSE; NOTIFYICONDATA nid; WndAndHandle * pWH = (WndAndHandle*)pParam; wchar_t cDbgStr[256] = L""; wcscpy(cDbgStr,L"enter HideWindowProc......"); wcscat(cDbgStr,pWH->cProcessName); wcscat(cDbgStr,L".................................."); dbview(cDbgStr); ShowWindow(pWH->hWnd,SW_HIDE); if(pWH->iHasTrayIcon == 1) { memset(&nid,0,sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = pWH->trayicon.hwnd; nid.uID = pWH->trayicon.uID; { int iCommandId = pWH->iCommandId; HWND g_TrayWnd = FindTrayToolbarWindow(); SendMessageW(g_TrayWnd,TB_HIDEBUTTON,WPARAM(iCommandId), (LPARAM)MAKELONG(TRUE,0)); NOTIFYICONDATA nid2; memset(&nid2,0,sizeof(nid2)); nid2.cbSize=sizeof(nid2); nid2.hWnd=nid.hWnd; nid2.uID=nid.uID; nid2.uFlags=NIF_STATE; nid2.dwState=NIS_HIDDEN; ::SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)FALSE,0); Shell_NotifyIcon(NIM_MODIFY,&nid2); SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)TRUE,0); } } CloseHandle(g_arrayHide[pWH->iLink]); g_arrayHide[pWH->iLink] = NULL; memset(cDbgStr,0,256*sizeof(wchar_t)); wcscpy(cDbgStr,L"leave HideWindowProc......"); wcscat(cDbgStr,pWH->cProcessName); wcscat(cDbgStr,L".................................."); dbview(cDbgStr); return 100; }
void _UnflipFromTray(UINT i, UINT uCmd) { if (MyIsHungAppWindow(g_pWti[i].hwnd)) return; DeleteTrayIcon(g_hwndMain, g_pWti[i].uID); if (IsWindow(g_pWti[i].hwnd)) { RECT rcTray = { 0 }; if (g_pWti[i].fAnimate && uCmd == SC_RESTORE) { ANIMATIONINFO ai; ai.cbSize = sizeof(ANIMATIONINFO); ai.iMinAnimate = FALSE; SystemParametersInfo(SPI_GETANIMATION, sizeof(ANIMATIONINFO), &ai, FALSE); if (ai.iMinAnimate) { HWND hwndTray = FindTrayToolbarWindow(); if (hwndTray) { GetWindowRect(hwndTray, &rcTray); rcTray.bottom = rcTray.top; rcTray.right = rcTray.left; #pragma FIX_LATER(tray animation <-> taskbar pos) KillTimer(g_hwndMain, TIMER_SETANIMATION); ai.iMinAnimate = 0; SystemParametersInfo(SPI_SETANIMATION, sizeof(ANIMATIONINFO), &ai, FALSE); SetTimer(g_hwndMain, TIMER_SETANIMATION, 500, NULL); DrawAnimatedRects(g_hwndMain, IDANI_CAPTION, &rcTray, &g_pWti[i].rcWnd); } } } //ShowWindow(g_pWti[i].hwnd, SW_SHOW); SetWindowPos(g_pWti[i].hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); if (uCmd == SC_RESTORE || uCmd == SC_CLOSE) { //ShowWindow(g_pWti[i].hwnd, SW_RESTORE); MySwitchToThisWindow(g_pWti[i].hwnd); if (uCmd == SC_CLOSE) PostMessage(g_pWti[i].hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); } } if (i - 1 != g_cWti) { MoveMemory(g_pWti + i, g_pWti + i + 1, (g_cWti - i - 1) * sizeof(WNDTRAYINFO)); } g_pWti[--g_cWti].hwnd = NULL; }
int GetProcessTrayIcon(DWORD lPID,TBBUTTON * pTB,TRAYDATA * pTrayData) { HWND hTrayWnd = FindTrayToolbarWindow(); DWORD dwPID = 0; GetWindowThreadProcessId(hTrayWnd,&dwPID); BOOL ret=FALSE; HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS |PROCESS_VM_OPERATION |PROCESS_VM_READ |PROCESS_VM_WRITE, FALSE, dwPID); PVOID ptb=VirtualAllocEx(hProcess,NULL,sizeof(TBBUTTON),MEM_COMMIT,PAGE_READWRITE); memset(pTB,0,sizeof(TBBUTTON)); HICON hIcon = NULL; ULONG lButtons=(ULONG)SendMessage(hTrayWnd,TB_BUTTONCOUNT,0,0); for(ULONG i=0;i<lButtons;++i) { SendMessage(hTrayWnd,TB_GETBUTTON,WPARAM(i),LPARAM(ptb)); ReadProcessMemory(hProcess,ptb,pTB,sizeof(TBBUTTON),NULL); ReadProcessMemory(hProcess,(PVOID)(pTB->dwData),pTrayData,sizeof(TRAYDATA),NULL); HWND hWnd=pTrayData->hwnd; DWORD dwProcessID = 0; GetWindowThreadProcessId(hWnd,&dwProcessID); if(dwProcessID == lPID) { SendMessage(hTrayWnd,g_HD_Msg_GetIcon,WPARAM(pTB->iBitmap),LPARAM(&hIcon)); pTrayData->hIcon = hIcon; break; } } VirtualFreeEx(hProcess,ptb,0/*sizeof(TBBUTTON) boundschecker 提示应该为0*/,MEM_RELEASE); CloseHandle(hProcess); return 1; }
int MyHideWindows() { NOTIFYICONDATA nid; if (bHideWindows == 1) { if (sOP.bDisableSound == 1) { CVolumeOutMaster OM; dwOldVolume = OM.GetCurrentVolume(); OM.SetCurrentVolume(0); CVolumeOutWave OW; dwOldWave = OW.GetCurrentVolume(); OW.SetCurrentVolume(0); //waveOutGetVolume(0,&dwOldVolume); //waveOutSetVolume(0,0); } EnableWindow(hAll,FALSE); EnableWindow(hLV,FALSE); for(int i1 = 0;i1<iBaSW_dll;i1++) { if(sW_dll[i1].bReserved != sOP.bReserveSel) { //ShowWindow(sW_dll[i1].hWnd,SW_HIDE); if(sOP.bHideProcess == 1) { HideProcess(sW_dll[i1].lPID); } sW_dll[i1].bHide = 1; sW_dll[i1].iLink = i1; // Use this member save thread handle index g_arrayHide[i1] = (HANDLE)_beginthreadex(NULL,0,HideWindowProc, sW_dll + i1,0,NULL); } } HANDLE hMonitorHandle = (HANDLE)_beginthreadex(NULL,0,MonitorProc, g_arrayHide,0,NULL); if(hMonitorHandle == INVALID_HANDLE_VALUE) { hMonitorHandle = NULL; } else { CloseHandle(hMonitorHandle); } if(sOP.bCleanAfterHide == 1) { g_pCleanHistory(); } if(sOP.bHideAllTray == 1) { AllocResourceForTrayList(); EnumAllVisibleTray_dll(); HideAllTray(); } dbview(L"enter sOP.bNeedStart == 1........................................"); if(sOP.bNeedStart == 1) { ShellExecute(NULL,L"open",sOP.cTrailRun,NULL,NULL,SW_SHOWNORMAL); } g_pClearTipText(); dbview(L"enter sOP.bUseMiddle........................................"); if(sOP.bUseMiddle) { g_pAppendTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW", L"再按鼠标中键可以重新显示窗口。"); } else if(sOP.bUseMouse) { g_pAppendTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW", L"再一齐按鼠标左右键可以重新显示窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW", L"再按下 隐藏窗口 快捷键可以重新显示窗口。"); } if(sOP.bUseMiddle) { g_pSetTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW", L"再按鼠标中键可以重新显示窗口。"); } else if(sOP.bUseMouse) { g_pSetTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW", L"再一齐按鼠标左右键可以重新显示窗口。"); } else { g_pSetTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW", L"再按下 隐藏窗口 快捷键可以重新显示窗口。"); } dbview(L"enter bHideWindows = 0;........................................"); bHideWindows = 0; } else if (bHideWindows == 0) { if (sOP.bUsePassword == 1) { if(hDlg_Validate != NULL && IsWindow(hDlg_Validate)) { return 1; } if (DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG_VALIDATE),NULL,(DLGPROC)ValidateProc) == 0) { return 1; } } EnableWindow(hAll,TRUE); EnableWindow(hLV,TRUE); RestoreVolume(); //2.2 method /// for (int i = 0;i < iBaSW_dll;i++) { if(sOP.bHideProcess == 1) { ShowProcess(sW_dll[i].lPID); } ShowWindow(sW_dll[i].hWnd,SW_SHOW); if(sW_dll[i].iHasTrayIcon == 1 && sW_dll[i].bHide == 1) { nid.cbSize = sizeof(NOTIFYICONDATA); nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE; nid.uID = sW_dll[i].trayicon.uID; nid.hIcon = sW_dll[i].trayicon.hIcon; nid.hWnd = sW_dll[i].trayicon.hwnd; wcscpy(nid.szTip,(const wchar_t *)sW_dll[i].cIconTip); nid.uCallbackMessage = sW_dll[i].trayicon.uCallbackMessage; // Shell_NotifyIcon(NIM_ADD,&nid); { int iCommandId = sW_dll[i].iCommandId; HWND g_TrayWnd = FindTrayToolbarWindow(); SendMessageW(g_TrayWnd,TB_HIDEBUTTON,WPARAM(iCommandId), (LPARAM)MAKELONG(FALSE,0)); NOTIFYICONDATA nid2; memset(&nid2,0,sizeof(nid2)); nid2.cbSize=sizeof(nid2); nid2.hWnd=nid.hWnd; nid2.uID=nid.uID; nid2.uFlags=NIF_STATE; nid2.dwState=NIS_HIDDEN; ::SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)FALSE,0); Shell_NotifyIcon(NIM_MODIFY,&nid2); SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)TRUE,0); } // HANDLE hHideWndHandle = (HANDLE)_beginthreadex(NULL,0,HideWindowProc,sW_dll + i1,0,NULL); // if(hHideWndHandle == INVALID_HANDLE_VALUE) // { // g_arrayHide[i1] = NULL; // } // else // { // g_arrayHide[i1] = hHideWndHandle; // } } sW_dll[i].bHide = 0; } if(sOP.bAutoHide_QH == 1 && iBaSW_QH > 0) { for(i = 0;i < iBaSW_QH;i++) { ShowWindow(pArr_dll[i],SW_SHOW); } iBaSW_QH = 0; } if(sOP.bHideAllTray == 1) { ShowAllTray(); ReleaseResourceForTrayList_dll(); } bHideWindows = 1; g_pClearTipText(); if(sOP.bUseMiddle) { g_pAppendTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND", L"按鼠标中键可以隐藏窗口。"); } else if(sOP.bUseMouse) { g_pAppendTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND", L"一齐按下鼠标左右键可以隐藏窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW", L"按下 隐藏窗口 的快捷键,即可隐藏窗口。"); } if(sOP.bReserveSel) { g_pAppendTipText(L"IDS_USAGETIP_SELWNDLISTCANRESERVEWND", L"您还可以在下边窗口列表里选择不想隐藏的窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_HIDESELITEM", L"在 窗口列表 里被选择的窗口将被隐藏。"); } if(sOP.bUseMiddle) { g_pSetTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND", L"按鼠标中键可以隐藏窗口。"); } else if(sOP.bUseMouse) { g_pSetTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND", L"一齐按下鼠标左右键可以隐藏窗口。"); } else { g_pSetTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW", L"按下 隐藏窗口 的快捷键,即可隐藏窗口。"); } iHideComplete = 1; } return 1; }
BOOL FlipToTray(HWND hwnd) { if (g_cWti >= MAX_WNDTRAY) return(FALSE); if (!IsWindow(hwnd)) return(FALSE); HWND hwndShell = GetShellWindow(), hwndTmp, hwndOwner; hwndTmp = hwndOwner = hwnd; do { hwndOwner = hwndTmp; hwndTmp = GetWindow(hwndTmp, GW_OWNER); } while (hwndTmp && hwndTmp != hwndShell); DWORD dw = GetWindowLongPtr(hwndOwner, GWL_STYLE); if (!(dw & WS_MINIMIZEBOX) || dw & WS_CHILD) return(FALSE); //SetForegroundWindow(g_hwndMain); //MySwitchToThisWindow(GetShellWindow()); for (UINT i = 0; i < g_cWti; i++) { if (g_pWti[i].hwnd == hwndOwner) { if (IsWindowVisible(hwndOwner)) _UnflipFromTray(i, 0); else return(FALSE); } } UINT uID = IDC_FIRSTTRAYICON; if (g_cWti > 0) { while (uID < IDC_FIRSTTRAYICON + MAX_WNDTRAY) { BOOL fIs1 = TRUE; for (UINT i = 0; i < g_cWti; i++) { if (g_pWti[i].uID == uID) fIs1 = FALSE; } if (fIs1) break; uID++; } } HICON hIcon, hIconSm; GetWindowIcons(hwndOwner, &hIcon, &hIconSm); WCHAR szCaption[MAX_CAPTION]; InternalGetWindowText(hwndOwner, szCaption, MAX_CAPTION); if (szCaption[0] == L'\0' && hwnd != hwndOwner) { InternalGetWindowText(hwnd, szCaption, MAX_CAPTION); } if (MyIsHungAppWindow(hwndOwner)) return(FALSE); RECT rcTray = { 0 }; g_pWti[g_cWti].fAnimate = FALSE; if (!(dw & WS_MINIMIZE)) { GetWindowRect(hwnd, &g_pWti[g_cWti].rcWnd); ANIMATIONINFO ai; ai.cbSize = sizeof(ANIMATIONINFO); ai.iMinAnimate = FALSE; SystemParametersInfo(SPI_GETANIMATION, sizeof(ANIMATIONINFO), &ai, FALSE); if (ai.iMinAnimate) { HWND hwndTray = FindTrayToolbarWindow(); if (hwndTray) { GetWindowRect(hwndTray, &rcTray); rcTray.bottom = rcTray.top; rcTray.right = rcTray.left; KillTimer(g_hwndMain, TIMER_SETANIMATION); g_pWti[g_cWti].fAnimate = TRUE; ai.iMinAnimate = 0; SystemParametersInfo(SPI_SETANIMATION, sizeof(ANIMATIONINFO), &ai, FALSE); SetTimer(g_hwndMain, TIMER_SETANIMATION, 500, NULL); DrawAnimatedRects(g_hwndMain, IDANI_CAPTION, &g_pWti[g_cWti].rcWnd, &rcTray); } } //ShowWindow(hwndOwner, SW_MINIMIZE); if (!SendMessageTimeout(hwndOwner, WM_SYSCOMMAND, SC_MINIMIZE, 0, SMTO_ABORTIFHUNG, 500, &dw)) return(FALSE); } //ShowWindow(hwndOwner, SW_HIDE); SetWindowPos(hwndOwner, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_HIDEWINDOW); //if (g_pWti[g_cWti].fAnimate) { //} g_pWti[g_cWti].hwnd = hwndOwner; g_pWti[g_cWti].uID = uID; g_pWti[g_cWti].hIconSm = hIconSm; g_cWti++; AddTrayIcon(g_hwndMain, uID, hIconSm, szCaption); return(TRUE); }