253 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #include "stdafx.h"
 | |
| #include <atlbase.h>
 | |
| #include <atlconv.h>
 | |
| #include <CommCtrl.h>
 | |
| #include <Windows.h>
 | |
| #include <iostream>
 | |
| #include <cstringt.h>
 | |
| #include <string>
 | |
| #include <atlstr.h>
 | |
| #include <vector>
 | |
| #include "shellapi.h"
 | |
| 
 | |
| 
 | |
| //std::vector<char*> tip_parts;
 | |
| LPCWSTR g_lpNames[]
 | |
| {
 | |
| 	L"Bluetooth",
 | |
| 	L"Internet"
 | |
| };
 | |
| 
 | |
| #include <iostream>
 | |
| 
 | |
| struct TBBUTTON_1
 | |
| {
 | |
| 	int iBitmap;
 | |
| 	int idCommand;
 | |
| 	byte fsState;
 | |
| 	byte fsStyle;
 | |
| 	byte bReserved1;
 | |
| 	byte bReserved2;
 | |
| 	long long dwData;
 | |
| 	int* iString;
 | |
| };
 | |
| /*
 | |
| bool contain(char* s, char* p) {
 | |
| 	int len1 = strlen(s);
 | |
| 	int len2 = strlen(p);
 | |
| 	if (len1 < len2) return false;
 | |
| 
 | |
| 	int index1 = 0;
 | |
| 	int index2 = 0;
 | |
| 
 | |
| 	while (index1 != len1 && index2 != len2)
 | |
| 	{
 | |
| 		if (s[index1] == p[index2]) {
 | |
| 			index1++; index2++;
 | |
| 			if (index2 == len2) return true;
 | |
| 		}
 | |
| 		else {
 | |
| 			index1++;
 | |
| 			index2 = 0;
 | |
| 		}
 | |
| 	}
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| int parseInt(char* s) {
 | |
| 
 | |
| 	int len = strlen(s);
 | |
| 	int result = 0;
 | |
| 	for (int i = 0; i < len; i++)
 | |
| 	{
 | |
| 		if (s[i] >= 48 && s[i] <= 57) result += ((s[i] - 48) * pow(10, len - i - 1));
 | |
| 		else return -1;
 | |
| 	}
 | |
| 	return result;
 | |
| 
 | |
| }
 | |
| */
 | |
| HWND FindOverflowTrayWindow(int iType)
 | |
| {
 | |
| 	HWND hWnd = NULL;
 | |
| 	if (iType == 0)  // look for NotifyIconOverflowWindow
 | |
| 	{
 | |
| 		hWnd = ::FindWindow(_T("NotifyIconOverflowWindow"), NULL);
 | |
| 		if (hWnd != NULL)    // look for ToobarWindow32 windows
 | |
| 			hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);
 | |
| 	}
 | |
| 	else if (iType == 1) // look for Shell_TrayWnd
 | |
| 	{
 | |
| 		hWnd = FindWindow(TEXT("Shell_TrayWnd"), NULL);
 | |
| 		hWnd = FindWindowEx(hWnd, 0, TEXT("TrayNotifyWnd"), NULL);
 | |
| 		hWnd = FindWindowEx(hWnd, 0, TEXT("SysPager"), NULL);
 | |
| 		hWnd = FindWindowEx(hWnd, 0, TEXT("ToolbarWindow32"), NULL);
 | |
| 	}
 | |
| 
 | |
| 	return hWnd;
 | |
| }
 | |
| 
 | |
| BOOL IsWindows64()
 | |
| {
 | |
| 	SYSTEM_INFO si = { 0 };
 | |
| 	::GetNativeSystemInfo(&si);
 | |
| 	if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
 | |
| 		return TRUE;
 | |
| 	else
 | |
| 		return FALSE;
 | |
| }
 | |
| 
 | |
| WCHAR MyToLowerW(WCHAR c)
 | |
| {
 | |
| 	if ((c >= L'A') && (c <= L'Z'))
 | |
| 	{
 | |
| 		c = c + (L'a' - L'A');
 | |
| 	}
 | |
| 	return c;
 | |
| }
 | |
| WCHAR * MyStrIStrW(const WCHAR * str1, const WCHAR * str2)
 | |
| {
 | |
| 	WCHAR *cp = (WCHAR *)str1;
 | |
| 	WCHAR *s1, *s2;
 | |
| 	WCHAR c1, c2;
 | |
| 
 | |
| 	if (!*str2)
 | |
| 		return((WCHAR *)str1);
 | |
| 
 | |
| 	while (*cp)
 | |
| 	{
 | |
| 		s1 = cp;
 | |
| 		s2 = (WCHAR *)str2;
 | |
| 		c1 = MyToLowerW(*s1);
 | |
| 		c2 = MyToLowerW(*s2);
 | |
| 		while (c1 && c2 && !(c1 - c2))
 | |
| 		{
 | |
| 			s1++, s2++;
 | |
| 			c1 = MyToLowerW(*s1);
 | |
| 			c2 = MyToLowerW(*s2);
 | |
| 		}
 | |
| 		if (!c2)
 | |
| 			return(cp);
 | |
| 		++cp;
 | |
| 	}
 | |
| 
 | |
| 	return(NULL);
 | |
| }
 | |
| 
 | |
| VOID SetTrayIconVisable(HWND hWnd, /*std::vector<char*>& tip_parts, */bool visable, bool isHardDelete)
 | |
| {
 | |
| 	if (hWnd == NULL)
 | |
| 		return;
 | |
| 
 | |
| 	struct TRAYDATA
 | |
| 	{
 | |
| 		HWND hWnd;
 | |
| 		UINT uID;
 | |
| 		UINT uCallbackMessage;
 | |
| 		DWORD Reserved1[2];
 | |
| 		HICON hIcon;
 | |
| 		DWORD Reserved2[3];
 | |
| 		TCHAR szExePath[MAX_PATH];
 | |
| 		TCHAR szTip[128];
 | |
| 	};
 | |
| 
 | |
| 
 | |
| 	DWORD dwProcessID = 0;
 | |
| 	DWORD dwButtonCount = 0;
 | |
| 	HANDLE hProcess = INVALID_HANDLE_VALUE;
 | |
| 	TBBUTTON_1 tbButton;
 | |
| 	LPVOID pTB;
 | |
| 	TRAYDATA td;
 | |
| 	NOTIFYICONDATA nid;
 | |
| 	TCHAR szSynTPEnhPath[MAX_PATH] = { 0 };
 | |
| 	TCHAR* pszApplicationName;
 | |
| 
 | |
| 	BOOL bIswin64 = IsWindows64();
 | |
| 
 | |
| 	// get icon count of specific windows
 | |
| 	dwButtonCount = (DWORD)::SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
 | |
| 	if (dwButtonCount == 0)
 | |
| 		return;
 | |
| 
 | |
| 	// get the thread of the window
 | |
| 	if ((::GetWindowThreadProcessId(hWnd, &dwProcessID) != 0)
 | |
| 		&& (dwProcessID != 0)) {
 | |
| 		hProcess = ::OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
 | |
| 			FALSE, dwProcessID);
 | |
| 		if (hProcess != NULL) {
 | |
| 			pTB = ::VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON_1), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 | |
| 			if (pTB != NULL) {
 | |
| 				// traverse all icons and hide the one you want to hide
 | |
| 				for (DWORD i = 0; i < dwButtonCount; i++) {
 | |
| 					bool flag1 = (SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)pTB) == TRUE);
 | |
| 					bool flag2 = (::ReadProcessMemory(hProcess, pTB, &tbButton, sizeof(TBBUTTON_1), NULL) != 0);
 | |
| 					bool flag3 = (::ReadProcessMemory(hProcess, LPVOID(tbButton.dwData), &td, sizeof(TRAYDATA), NULL) != 0);
 | |
| 					//if (GetLastError() != 0) std::cout << "ERROR:" << GetLastError() << "\t";
 | |
| 					if (flag1 && flag2 && flag3) {
 | |
| 						WCHAR szTips[1024] = {0};
 | |
| 						RtlZeroMemory(szTips, sizeof(szTips));
 | |
| 						if (bIswin64){
 | |
| 							::ReadProcessMemory(hProcess, (LPVOID)tbButton.iString, szTips, 1024, NULL);
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							::ReadProcessMemory(hProcess, (LPVOID)(tbButton.dwData&0x00000000FFFFFFFF), szTips, 1024, NULL);
 | |
| 						}
 | |
| 						//::MessageBoxW(NULL, szTips, NULL, MB_ICONERROR);
 | |
| 						//szTips is a unicode string which needs transforming
 | |
| 						//USES_CONVERSION;
 | |
| 						//CString csTips = W2A((WCHAR*)(szTips));
 | |
| 						//std::string tip = csTips.GetBuffer(0);						
 | |
| 						bool existFlag = false;
 | |
| 
 | |
| //						for (int i = 0; i < tip_parts.size(); i++) {
 | |
| //							if (contain(const_cast<char*>(tip.c_str()), tip_parts.at(i))) { existFlag = true; break; }
 | |
| //						}
 | |
| 						size_t nCnt = sizeof(g_lpNames) / sizeof(LPCWSTR);
 | |
| 						for (size_t i = 0; i < nCnt; i++)
 | |
| 						{
 | |
| 							LPCWSTR lpName = g_lpNames[i];
 | |
| 							if (MyStrIStrW(szTips,lpName ))
 | |
| 							{
 | |
| 								existFlag = true;
 | |
| 							}
 | |
| 						}
 | |
| 						if (existFlag) {
 | |
| 							if (isHardDelete && !visable) { // hard delete , the icon can not recover
 | |
| 								nid.cbSize = NOTIFYICONDATA_V2_SIZE;
 | |
| 								nid.uID = td.uID;
 | |
| 								nid.hWnd = td.hWnd;
 | |
| 								nid.hIcon = td.hIcon;
 | |
| 								nid.uCallbackMessage = td.uCallbackMessage;
 | |
| 								nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
 | |
| 								::Shell_NotifyIcon(NIM_DELETE, &nid);
 | |
| 							}
 | |
| 							//WCHAR szString1[1024];
 | |
| 							//_swprintf(szString1, L"SET %s visable=%d", szTips,visable);
 | |
| 							//::MessageBoxW(NULL, szString1, NULL, MB_ICONERROR);
 | |
| 							::SendMessage(hWnd, TB_HIDEBUTTON, tbButton.idCommand, MAKELONG(!visable, 0)); // MAKELONG(true, 0) is hide, otherwise is show
 | |
| 							::SendMessage(hWnd, TB_AUTOSIZE, 0, 0);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				::VirtualFreeEx(hProcess, pTB, sizeof(TBBUTTON_1), MEM_FREE);
 | |
| 			}
 | |
| 			::CloseHandle(hProcess);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int HideBlueIcon( int v )
 | |
| {
 | |
| //	tip_parts.push_back((char*)"Bluetooth");
 | |
| //	tip_parts.push_back((char*)"Internet");
 | |
| //	tip_parts.push_back((char*)"蓝牙设备");
 | |
| 
 | |
| 	bool visable =  (bool)v;
 | |
| 	SetTrayIconVisable(FindOverflowTrayWindow(0), /*tip_parts, */visable, false);
 | |
| 	SetTrayIconVisable(FindOverflowTrayWindow(1), /*tip_parts, */visable, false);
 | |
| 	return 0;
 | |
| }
 |