C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[245] Win7, Win10 .. Orphaned 시스템 트레이 아이콘 제거
빌더(TWx) [builder] 951 읽음    2017-10-03 00:30
C++ 빌더 Q & A 게시판에 질문이 올라와서 잠시 구현해 본 코드.

http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=74600
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=74604


다음은 Windows 7, Windows 10 에서
고아가 된 시스템 트레이 아이콘을 제거하도록 구현해 본 코드이다.

특이점은 OS가 64비트이든, 32비트이든 상관없이 동작하도록 하고
프로그램 역시 64비트로 컴파일 하든, 32비트로 컴파일 하든 상관없이
동작하도록 구현해 보았다. 이제는 유물이된 XP는 고려하지 않음.

Windows Shell을 Injection 해서 처리 할 수도 있지만, 쉘 프로세스 메모리를 읽는 방식으로 처리.



bool removeOrphanedTrayIcon()
{
	auto hWnd = FindWindowExA(FindWindowA("NotifyIconOverflowWindow", 0), 0, "ToolbarWindow32", 0);
	if (!hWnd) {
		printf("error: Window handle invalid...\n");
		return false;
	}

	DWORD pid;
	GetWindowThreadProcessId(hWnd, &pid);
	auto hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
	if (!hProcess) {
		printf("error: OpenProcess()...\n");
		return false;
	}

	auto pBuf = VirtualAllocEx(hProcess, 0, 0x20, MEM_COMMIT, PAGE_READWRITE);
	if (!pBuf) {
		printf("error: VirtualAllocEx()...\n");
		CloseHandle(hProcess);
		return false;
	}

	BYTE tmp[0x20];
	auto p1 = ((PULONG)tmp + 3), p2 = ((PULONG)tmp + 1);  // 32bit OS Shell Internal

	if (GetSystemWow64Directory(0, 0)) 
		p1 = ((PULONG)tmp + 4), p2 = ((PULONG)tmp + 2); // 64bit OS Shell Internal

	bool ret = true;
	const int TrayCount = 0x418;
	const int TrayInfo = 0x417;

	struct TE {
		HWND hWnd;
		UINT uID;
	};

	TE te = {0};
	std::vector< TE > vOrphanedTray;

	for (int i = 0, count = (int)SendMessage(hWnd, TrayCount, 0, 0); i < count; ++i)
	{
		if (!SendMessage(hWnd, TrayInfo, i, (LPARAM)pBuf)) {
			printf("error: SendMessage()...\n");
			ret = false;
			break;
		}

		ReadProcessMemory(hProcess, pBuf, &tmp, 0x20, 0);
		if (!*p1)
			continue;

		ReadProcessMemory(hProcess, (LPVOID)(ULONG_PTR)*p1, &tmp, 0x10, 0);

		te.hWnd = (HWND)(ULONG_PTR)*(PULONG)tmp;
		te.uID = *p2;

		if ((pid = 0, GetWindowThreadProcessId(te.hWnd, &pid), !pid))
			vOrphanedTray.push_back(te);
	}

	NOTIFYICONDATA  nid = { sizeof(nid), 0 };

	for (auto & t : vOrphanedTray) 
	{
		nid.hWnd = t.hWnd, nid.uID = t.uID;
		printf("remove Orphaned System Tray Icon...\n");
		printf("  hWnd: %p, uID: %0lX\n", nid.hWnd, nid.uID);
		Shell_NotifyIcon(NIM_DELETE, &nid);
	}

	VirtualFreeEx(hProcess, pBuf, 0, MEM_RELEASE);
	CloseHandle(hProcess);
	return ret;
}




+ -

관련 글 리스트
245 Win7, Win10 .. Orphaned 시스템 트레이 아이콘 제거 빌더(TWx) 951 2017-10-03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.