VC通過托盤圖標(biāo)得到該所屬進(jìn)程的實(shí)現(xiàn)代碼
本例以獲取程序托盤圖標(biāo)位置為例
//根據(jù)需要還可以獲取不少信息
代碼一
//獲取托盤區(qū)域數(shù)據(jù)
RECT CTray::GetTrayRect()
{
RECT rect = {0};
HWND hWnd = NULL;
hWnd = FindTrayWnd();
if (hWnd != NULL)
{
if (!EnumNotifyWindow(rect,hWnd))//如果沒在普通托盤區(qū)
{
hWnd = FindNotifyIconOverflowWindow();//在溢出區(qū)(win7)
if (hWnd != NULL)
{
EnumNotifyWindow(rect,hWnd);
}
}
}
return rect;
}
//枚舉獲取托盤區(qū)域位置
bool CTray::EnumNotifyWindow(RECT &rect,HWND hWnd)
{
//RECT rect = {0};
bool bSuc = false;
unsigned long lngPID = 0;
long ret = 0,lngButtons = 0;
long lngHwndAdr = 0,lngHwnd = 0;//,lngTextAdr,lngButtonID;
HANDLE hProcess = NULL;
LPVOID lngAddress = NULL,lngRect = NULL;
if (hWnd != NULL)
{
ret = GetWindowThreadProcessId(hWnd, &lngPID);
if(ret != 0 && lngPID != 0)
{
hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID);//
if (hProcess != NULL)
{
lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE);
lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0); //發(fā)送消息獲取托盤button數(shù)量
if (lngAddress != NULL && lngRect != NULL)
{
for(int i=0 ;i< lngButtons;i++)
{
RECT rc = {0};
int j = i;
ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));//發(fā)送消息獲取托盤項(xiàng)數(shù)據(jù)起始地址
ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0);
if(ret != 0 && lngHwndAdr != -1)
{
ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);//獲取句柄
if(ret != 0 && (HWND)lngHwnd == m_NotifyIconData.hWnd)//
{
ret = ::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect); //發(fā)送消息獲取托盤項(xiàng)區(qū)域數(shù)據(jù)
ret = ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0); //讀取托盤區(qū)域數(shù)據(jù)
if(ret != 0)
{
CWnd::FromHandle(hWnd)->ClientToScreen(&rc);
rect = rc;
}
bSuc = true;//在普通托盤區(qū)找到,在溢出區(qū)不再查找
break;
}
}
}
}
if (lngAddress != NULL)
{
VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);
}
if (lngRect != NULL)
{
VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);
}
CloseHandle(hProcess);
}
}
}
return bSuc;
}
//獲取普通托盤區(qū)窗口句柄
HWND CTray::FindTrayWnd()
{
HWND hWnd = NULL;
HWND hWndPaper = NULL;
if ((hWnd = FindWindow(_T("Shell_TrayWnd"), NULL)) != NULL)
{
if ((hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL)) != NULL)
{
hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);
if(!hWndPaper)
hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);
else
hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);
}
}
return hWnd;
}
//獲取溢出托盤區(qū)窗口句柄
HWND CTray::FindNotifyIconOverflowWindow()
{
HWND hWnd = NULL;
hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);
if (hWnd != NULL)
{
hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);
}
return hWnd;
}
以下代碼網(wǎng)上收集的,變量 初始化 指針句柄 及函數(shù)是否成功都沒判定
//需要的自己加下判定,有時(shí)間再改了
代碼二
struct TRAYDATA
{
HWND hwnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved[2];
HICON hIcon;
};
void CTray::GetTrayRect()
{
HWND hWnd,hWndPaper;
unsigned long lngPID;
long ret,lngButtons;
HANDLE hProcess;
LPVOID lngAddress;
long lngTextAdr,lngHwndAdr,lngHwnd,lngButtonID;
TCHAR strBuff[1024]={0};
TRAYDATA trayData = {0};
TBBUTTON btnData={0};
hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL);
hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);
if(!hWndPaper)
hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);
else
hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);
ret = GetWindowThreadProcessId(hWnd, &lngPID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID);
lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE);
lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
RECT rc; POINT point;
LPVOID lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
CRect rect;
for(int i=0 ;i< lngButtons;i++)
{
int j = i;
ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));
ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 16),&lngTextAdr,4,0);
if(lngTextAdr != -1)
{
ret = ReadProcessMemory(hProcess, LPVOID(lngTextAdr),strBuff,1024,0);
//ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0); //獲取句柄
//ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);
//ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 4),&lngButtonID,4,0);//獲取buttonID
CString str(strBuff);
if (str.Compare(m_NotifyIconData.szTip) == 0)
{
::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect);
ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0); //獲取托盤圖標(biāo)區(qū)域
CWnd::FromHandle(hWnd)->ClientToScreen(&rc);
}
//以下是隱藏托盤圖標(biāo)
// {
// if(show)
// {
// SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,0);
// }
// else
// {
// SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,1);
// }
// }
}
}
VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);
VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);
CloseHandle(hProcess);
}
代碼三
VOID StartStorm()
{
HWND hMain = FindWindow("animate_layered_window_class", "暴風(fēng)媒體中心");
if ( hMain )
{
ShowWindow(hMain, SW_HIDE);
}
//得到工具欄句柄
HWND hTray = FindWindow("Shell_TrayWnd", NULL);
hTray = FindWindowEx(hTray, 0, "TrayNotifyWnd", NULL);
hTray = FindWindowEx(hTray, 0, "SysPager", NULL);
hTray = FindWindowEx(hTray, 0, "ToolbarWindow32", NULL);
//獲取explore進(jìn)程ID
DWORD TrayPid;
GetWindowThreadProcessId(hTray, &TrayPid);
//打開進(jìn)程 并且開辟進(jìn)程空間
RECT rect;
TBBUTTON tb;
TBBUTTON pTb;
LPVOID lpAddr;
DWORD dwThreadIdOfICO;
DWORD dwTempId = FindStorm("Stormtray.exe"); //你要點(diǎn)擊的進(jìn)程的PID
TRAYDATA traydata;
HANDLE hOpen = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TrayPid);
lpAddr = VirtualAllocEx(hOpen, NULL, sizeof(tb) + sizeof(rect), MEM_COMMIT, PAGE_READWRITE);
int nCount = SendMessage(hTray, TB_BUTTONCOUNT, 0, 0);
int i;
DWORD dwOutWrite;
for ( i = 0; i < nCount; i ++)
{
ZeroMemory(&tb, sizeof(tb));
ZeroMemory(&rect, sizeof(rect));
//把參數(shù)寫進(jìn)目標(biāo)進(jìn)程
WriteProcessMemory(hOpen, lpAddr, &tb, sizeof(tb), &dwOutWrite);
//WriteProcessMemory(hOpen, (LPVOID)((DWORD)lpAddr + sizeof(pTb)), &rect, sizeof(rect), &dwOutWrite);
//獲取BUTTON
SendMessage(hTray, TB_GETBUTTON, i, LPARAM(lpAddr));
//讀取TBBUTTON結(jié)構(gòu)
ReadProcessMemory(hOpen, lpAddr, &pTb, sizeof(TBBUTTON), &dwOutWrite);
//讀取TRAYDATA結(jié)構(gòu)
ReadProcessMemory(hOpen, (LPVOID)pTb.dwData, &traydata, sizeof(TRAYDATA), &dwOutWrite);
GetWindowThreadProcessId(traydata.hwnd, &dwThreadIdOfICO);
if ( dwThreadIdOfICO == dwTempId )
{
//獲取ICO的RECT
LPVOID lp = (LPVOID)((DWORD)lpAddr + sizeof(pTb));
SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)lp);
LPVOID lpdata = (LPVOID)((DWORD)lpAddr + sizeof(TBBUTTON));
ReadProcessMemory(hOpen, lpdata, &rect, sizeof(rect), &dwOutWrite);
int iGap = rect.right/2; //得到圖標(biāo)的中間坐標(biāo)的間隔
//點(diǎn)擊
SendMessage(hTray, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
SendMessage(hTray, WM_LBUTTONUP, 0, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
//
CloseHandle(hOpen);
break;;
}
}
}
win7有一個(gè)溢出托盤區(qū):以下是隱藏在托盤區(qū)中的托盤信息,用以上的方法找不到,因?yàn)樵贜otifyIconOverflowWindow里
Fhwnd = FindWindow("NotifyIconOverflowWindow", NULL)
參考文章:http://topic.csdn.net/u/20101003/23/859851ee-5aa1-4476-8ce1-1359826df2b0.html
代碼四
#include "stdafx.h"
#include <afx.h>
#include <locale.h>
#include <string>
using namespace std;
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
LPFN_ISWOW64PROCESS
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(_T("kernel32")),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// handle error
}
}
return bIsWow64;
}
HWND FindTrayWnd()
{
HWND hWnd = NULL;
hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
hWnd = FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"), NULL);
hWnd = FindWindowEx(hWnd, NULL, _T("SysPager"), NULL);
hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);
return hWnd;
}
HWND FindNotifyIconOverflowWindow()
{
HWND hWnd = NULL;
hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);
hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);
return hWnd;
}
void EnumNotifyWindow(HWND hWnd)
{
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hWnd,&dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
if ( hProcess==NULL ){
return;
}
LPVOID lAddress = VirtualAllocEx(hProcess, 0, 4096, MEM_COMMIT, PAGE_READWRITE);
if ( lAddress==NULL ){
return;
}
DWORD lTextAdr = 0;
BYTE buff[1024] = {0};
CString strFilePath;
CString strTile;
HWND hMainWnd = NULL;
int nDataOffset = sizeof(TBBUTTON) - sizeof(INT_PTR) - sizeof(DWORD_PTR);
int nStrOffset = 18;
if ( IsWow64() ){
nDataOffset+=4;
nStrOffset+=6;
}
//得到圖標(biāo)個(gè)數(shù)
int lButton = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
for (int i = 0; i < lButton; i++) {
SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)lAddress);
//讀文本地址
ReadProcessMemory(hProcess, (LPVOID)((DWORD)lAddress + nDataOffset), &lTextAdr, 4, 0);
if ( lTextAdr!=-1 ) {
//讀文本
ReadProcessMemory(hProcess, (LPCVOID)lTextAdr, buff, 1024, 0);
hMainWnd = (HWND)(*((DWORD*)buff));
strFilePath = (WCHAR *)buff + nStrOffset;
strTile = (WCHAR *)buff + nStrOffset + MAX_PATH;
_tprintf(_T("%s %s\n"),strTile,strFilePath);
}
}
VirtualFreeEx(hProcess, lAddress, 4096, MEM_RELEASE);
CloseHandle(hProcess);
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs");
EnumNotifyWindow(FindTrayWnd());
_tprintf(_T("\n"));
EnumNotifyWindow(FindNotifyIconOverflowWindow());
system("pause");
return 0;
}
代碼五
void CTrayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND wd=::FindWindow("Shell_TrayWnd",NULL);
if (wd==NULL)
{
MessageBox("Error1");
return;
}
HWND wtd=FindWindowEx(wd,NULL,"TrayNotifyWnd",NULL);
if (wtd==NULL)
{
MessageBox("Error2");
return;
}
HWND wd1=FindWindowEx(wtd,NULL,"ToolbarWindow32",NULL);
if (wd1==NULL)
{
MessageBox("Error3");
return;
}
DWORD pid;
pid=0;
GetWindowThreadProcessId(wd1,&pid);
if (pid==NULL)
{
MessageBox("Error4");
return;
}
HANDLE hd=OpenProcess(PROCESS_QUERY_INFORMATION ¦ PROCESS_ALL_ACCESS ,true,pid);
if (hd==NULL)
{
MessageBox("Error6");
return;
}
int num=::SendMessage(wd1,TB_BUTTONCOUNT ,NULL,NULL);
int i;
unsigned long n;
TBBUTTON p,*pp;
CString x;
wchar_t name[256];
unsigned long whd,proid;
CString temp;
TBBUTTON *sp;
sp= (TBBUTTON *)0x20f00; //這里應(yīng)該改成用VirtualAllocEx分配內(nèi)存否則有可能出錯(cuò),不過人懶,就先這么著吧
for(i=0;i<num;i++)
{
::SendMessage(wd1,TB_GETBUTTON,i,(LPARAM)sp);
pp=&p;
ReadProcessMemory(hd,sp,pp,sizeof(p),&n);
// x.Format("%x %x %x %x %x %x",p.iBitmap,p.idCommand,p.fsState,p.fsStyle, p.dwData, p.iString);
name[0]=0;
if (p.iString!=0xffffffff)
{
try
{
ReadProcessMemory(hd,(void *)p.iString,name,255,&n);
name[n]=0;
}
catch()
{
}
// x+=" ";
// x+=name;
temp=name;
try
{
whd=0;
ReadProcessMemory(hd,(void *)p.dwData,&whd,4,&n);
}
catch()
{
}
proid=0;
GetWindowThreadProcessId((HWND)whd,&proid);
x.Format("位置=%d 名稱=%s 窗口句柄=%08x 進(jìn)程ID=%08x",
i,(LPCTSTR )temp,whd,proid);
m_list.AddString(x);
}
}
}
代碼六
void CTrayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND wd=::FindWindow("Shell_TrayWnd",NULL);
if (wd==NULL)
{
MessageBox("Error1");
return;
}
HWND wtd=FindWindowEx(wd,NULL,"TrayNotifyWnd",NULL);
if (wtd==NULL)
{
MessageBox("Error2");
return;
}
HWND wd1=FindWindowEx(wtd,NULL,"ToolbarWindow32",NULL);
if (wd1==NULL)
{
MessageBox("Error3");
return;
}
DWORD pid;
pid=0;
GetWindowThreadProcessId(wd1,&pid);
if (pid==NULL)
{
MessageBox("Error4");
return;
}
HANDLE hd=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS ,true,pid);
if (hd==NULL)
{
MessageBox("Error6");
return;
}
int num=::SendMessage(wd1,TB_BUTTONCOUNT ,NULL,NULL);
int i;
unsigned long n;
TBBUTTON p,*pp;
CString x;
wchar_t name[256];
unsigned long whd,proid;
CString temp;
TBBUTTON *sp;
sp= (TBBUTTON *)0x20f00;
for(i=0;i<num;i++)
{
::SendMessage(wd1,TB_GETBUTTON,i,(LPARAM)sp);
pp=&p;
ReadProcessMemory(hd,sp,pp,sizeof(p),&n);
// x.Format("%x %x %x %x %x %x",p.iBitmap,p.idCommand,p.fsState,p.fsStyle, p.dwData, p.iString);
name[0]=0;
if (p.iString!=0xffffffff)
{
try
{
ReadProcessMemory(hd,(void *)p.iString,name,255,&n);
name[n]=0;
}
catch(...)
{
}
// x+=" ";
// x+=name;
temp=name;
try
{
whd=0;
ReadProcessMemory(hd,(void *)p.dwData,&whd,4,&n);
}
catch(...)
{
}
proid=0;
GetWindowThreadProcessId((HWND)whd,&proid);
x.Format("位置=%d 名稱=%s 窗口句柄=%08x 進(jìn)程ID=%08x",
i,(LPCTSTR )temp,whd,proid);
m_list.AddString(x);
}
}
}
到此這篇關(guān)于VC通過托盤圖標(biāo)得到該所屬進(jìn)程的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)VC托盤圖標(biāo)得到該所屬進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C 語言中實(shí)現(xiàn)環(huán)形緩沖區(qū)
本文主要是介紹 C語言實(shí)現(xiàn)環(huán)形緩沖區(qū),并附有詳細(xì)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,希望能幫助有需要的小伙伴2016-07-07
深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
本篇文章是對(duì)二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
適合初學(xué)者練習(xí)的C語言實(shí)現(xiàn)三子棋小游戲
今天這篇文章主要介紹給大家分享一個(gè)適合初學(xué)者練習(xí)的利用C語言寫三子棋小游戲,用簡(jiǎn)單的C語言來實(shí)現(xiàn)小時(shí)候玩的三子棋游戲,下面是人機(jī)對(duì)戰(zhàn),當(dāng)然這個(gè)代碼的電腦對(duì)手是人工智障而不是人工智能 詳細(xì)內(nèi)容就請(qǐng)跟小編一起來閱讀下面文章內(nèi)容吧2021-10-10
c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式
這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

