怎样win7怎么查看注册表win7的nd表项

在Win7中,如何检测托盘图标是否存在?包括两个区域,右下角可见的通知区域和掩藏的溢出区域:
使用如下的代码是有问题:
//&判断在通知区域是否有托盘图标
BOOL32&CMainFrameWnd::IsTrayIconExsitInNotifyArea()
HWND&hWnd&=&NULL,&hWndPager&=&NULL;&&
unsigned&long&ulPID&=&0;&&
long&lRet&=&0,&lButtons&=&0;&&
HANDLE&hProcess&=&NULL;&&
LPVOID&pAddress&=&NULL;&&
long&lTextAdr&=&0,&lHwndAdr&=&0,&lHwnd&=&0,&lButtonID&=&0;&&
char&strBuff[1024]&=&{&0&};&&
char&*pStr&=&NULL;&&
char&*pTemp&=&NULL;&&
hWnd&=&::FindWindow(&_T(&Shell_TrayWnd&),&NULL&);&&
hWnd&=&::FindWindowEx(&hWnd,&0,&_T(&TrayNotifyWnd&),&NULL&);&&
hWndPager&=&::FindWindowEx(&hWnd,&0,&_T(&SysPager&),&NULL&);&&
if(&hWndPager&==&NULL&)
hWnd&=&::FindWindowEx(&hWnd,&0,&_T(&ToolbarWindow32&),&NULL&);&//&对于
Win2000,没有SysPager窗口
hWnd&=&::FindWindowEx(&hWndPager,&0,&_T(&ToolbarWindow32&),&NULL&);&&
lRet&=&GetWindowThreadProcessId(&hWnd,&&ulPID&);&&
hProcess&=&OpenProcess(&
PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,&0,&ulPID&);&&
pAddress&=&VirtualAllocEx(&hProcess,&0,&0x4096,&MEM_COMMIT,&PAGE_READWRITE&);&&
lButtons&=&::SendMessage(&hWnd,&TB_BUTTONCOUNT,&0,&0&);&&
for(&int&i=0;&i&&lB&i++&)&&
lRet&=&::SendMessage(&hWnd,&TB_GETBUTTON,&i,&long(pAddress)&);&&
lRet&=&ReadProcessMemory(&hProcess,&LPVOID(long(pAddress)&+&16),&&lTextAdr,&
if(&lTextAdr&!=&-1&)&&
lRet&=&ReadProcessMemory(&hProcess,&LPVOID(lTextAdr),&strBuff,&1024,&
USES_CONVERSION;&&
pStr&=&OLE2T(&(LPOLESTR)(&strBuff&)&);&
pTemp&=&strstr(&pStr,&MAIN_DLG_WINDOWNAME&);&//&通过Toolbar中的按钮
名称(“XXXXXX”)来比对&&
if&(&pTemp&!=&NULL&)&//&找到对应字串
VirtualFreeEx(&hProcess,&pAddress,&0X4096,&MEM_RELEASE&);&&
CloseHandle(&hProcess&);&&
return&TRUE;
VirtualFreeEx(&hProcess,&pAddress,&0X4096,&MEM_RELEASE&);&&
CloseHandle(&hProcess&);&&
return&FALSE;
//&判断在托盘溢出区域是否有托盘图标(此种情况针对Win7和Win8系统)
BOOL32&CMainFrameWnd::IsTrayIconExsitInOverflowWindow()
HWND&hWnd&=&NULL;&&
unsigned&long&ulPID&=&0;&&
long&lRet&=&0,&lButtons&=&0;&&
HANDLE&hProcess&=&NULL;&&
LPVOID&pAddress&=&NULL;&&
long&lTextAdr&=&0,&lHwndAdr&=&0,&lHwnd&=&0,&lButtonID&=&0;&&
char&strBuff[1024]&=&{&0&};&&
char&*pStr&=&NULL;&&
char&*pTemp&=&NULL;
//&对于Win7、Win8系统,新增了通知溢出区域,所以要检查该区域中是否有托盘图标&&
hWnd&=&::FindWindow(&_T(&NotifyIconOverflowWindow&),&NULL&);&//&获取通知溢出区域句柄&
hWnd&=&::FindWindowEx(&hWnd,&NULL,&_T(&ToolbarWindow32&),&NULL&);
lRet&=&GetWindowThreadProcessId(&hWnd,&&ulPID&);&&
hProcess&=&OpenProcess(&
PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,&0,&ulPID&);&&
pAddress&=&VirtualAllocEx(&hProcess,&0,&0x4096,&MEM_COMMIT,&PAGE_READWRITE&);&&
lButtons&=&::SendMessage(&hWnd,&TB_BUTTONCOUNT,&0,&0&);&&
for(&int&i=0;&i&&lButtons&-&1;&i++&)&&
lRet&=&::SendMessage(&hWnd,&TB_GETBUTTON,&i,&long(pAddress)&);&&
lRet&=&ReadProcessMemory(&hProcess,&LPVOID(long(pAddress)&+&16),&&lTextAdr,&
if(&lTextAdr&!=&-1&)&&
lRet&=&ReadProcessMemory(&hProcess,&LPVOID(lTextAdr),&strBuff,&1024,&
USES_CONVERSION;&&
pStr&=&OLE2T(&(LPOLESTR)(&strBuff&)&);&
pTemp&=&strstr(&pStr,&_T(&XXXXXXXX&)&);&//&通过窗口名称(“XXXXXXX”
if&(&pTemp&!=&NULL&)&//&找到对应字串
VirtualFreeEx(&hProcess,&pAddress,&0X4096,&MEM_RELEASE&);&&
CloseHandle(&hProcess&);&&
return&TRUE;
VirtualFreeEx(&hProcess,&pAddress,&0X4096,&MEM_RELEASE&);&&
CloseHandle(&hProcess&);&&
return&FALSE;
回复讨论(解决方案)
问题如下:
1、上面的代码使用到跨进程的内存读取,调用了ReadProcessMemory,但是由于程序是32位的,目标窗口在EXplorer进程中,在64位的机器上(比如64的Win7),读取是有问题的。应该是32位进程直接读取64位进程是有问题的。
2、上面的代码看上去有点牵强,是非文档化的东西,写到程序应该不是很靠谱。
3、关于是否有托盘图标,托盘是否在掩藏的溢出区域,没有对应API可供使用,也没有对应的注册表项可以读取,上述的检测很难实现。
另外的问题:
1、实现了类似QQ来消息头像闪动的功能,动态的闪动是通过将托盘图标设置成头像和空白之间来来回切换实现的。但是消息查看过后,要将托盘图标恢复成正常时的图标。但是Shell_NotifyIcon&API调用失败,导致托盘图标恢复失败,显示空白,但是位置还在的。尝试过多设置几次,发现也没效果,都会失败。也查看了lasterror值。
2、在个别机器上出现托盘图标因不明原因消失,而此时程序依然在运行(任务管理器中能找到对应的进程)。于是开启一个守护托盘图标的定时器,定时检测托盘图标是否存在,通过调用Shell_NotifyIcon修改图标信息(其实NOTIFYICONDATA结构体信息没变,只是用同样的NOTIFYICONDATA信息执行了修改动作)。但这样也不能百分之百的解决问题,还是会出现托盘图标消失问题,只是降低了概率。相关代码:
&&&&void&CXXDlg::OnTimer(&UINT_PTR&nIDEvent&)&&
&&&&&&&&if&(&nIDEvent&==&100&)&&
&&&&&&&&{&&
&&&&&&&&&&&&if&(&!Shell_NotifyIcon(&NIM_MODIFY,&&m_nid&)&)&&
&&&&&&&&&&&&&&&&Shell_NotifyIcon(&NIM_ADD,&&m_nid&);&&
&&&&&&&&}&&
&&&&&&&&CDialog::OnTimer(nIDEvent);&&
没用过Win7。关注该问题
关于托盘图标不明原因消失的问题,XP和Win7中均出现过!
关于托盘图标不明原因消失的问题,XP和Win7中均出现过!
是不是重启explorer.exe后消失?
中文系统要自己注册TaskbarCreated消息后处理
关于托盘图标不明原因消失的问题,XP和Win7中均出现过!
是不是重启explorer.exe后消失?
中文系统要自己注册TaskbarCreated消息后处理
这种情况最简单,肯定处理了!
看来这样的问题确实很难解决啊,都没什么人回应的
一直在用win7,没注意过
关于托盘图标不明原因消失的问题,XP和Win7中均出现过!
是不是重启explorer.exe后消失?
中文系统要自己注册TaskbarCreated消息后处理
其实这个消息通知解决2方面问题:
1、程序运行过程中,explorer资源管理器异常退出,重启后手动添加托盘图标到通知区域;
2、在Win7中将程序设置为开机自启动,有时会出现托盘图标创建失败的问题,应该是程序自启动时,资源管理器还没创建完成,所以隶属于资源管理器进程的托盘图标通知窗口还没创建,导致向其中添加托盘图标失败。那么注册了这个消息,在收到资源管理器创建完成的消息时,再创建托盘图标,具体说明见msdn上的描述:
Shell_NotifyIcon&will&often&fail&when&called&during&Windows&startup&(for&instance,&if&your&application&is&listed&in&HKLM\Software\Microsoft\Windows\CurrentVersion\Run.&This&appears&to&be&because&the&system&is&busy&starting&applications.&The&failure&is&more&common&on&low-spec&computers&or&computers&with&some&brands&of&antivirus&software&installed,&which&seem&to&be&very&intensive&at&startup.
Unfortunately,&you&cannot&rely&on&the&error&code&returned&by&GetLastError.&When&Shell_NotifyIcon&returns&false,&some&of&the&common&errors&returned&by&GetLastError&are:
&&&&ERROR_FILE_NOT_FOUND&(2)
&&&&ERROR_TIMEOUT&(1460)
&&&&ERROR_SUCCESS&(0)
The&most&appropriate&response&to&any&error&returned&by&Shell_NotifyIcon&is&to&sleep&for&a&period&of&time&and&retry.
An&explanation&of&why&the&error&code&may&differ&has&been&made&by&Paul&Baker,&paraphrased&from/group/microsoft.public.platformsdk.shell/msg/cbf5dfa&and/group/microsoft.public.platformsdk.shell/msg/c03fc:
Shell_NotifyIcon&actually&calls&SetLastError(0)&initially.&After&that,&basically&it&uses&FindWindow&to&find&the&tray&notification&window.&If&this&fails,&it&will&typically&return&ERROR_FILE_NOT_FOUND.&Otherwise&it&sends&a&WM_COPYDATA&message&to&the&tray&notification&window,&using&SendMessageTimeout&with&a&timeout&of&only&4&seconds.&If&that&message&returns&zero,&then&Shell_NotifyIcon&will&fail&with&GetLastError&returning&zero.
reply&to&the&above...
Applications&that&want&to&use&the&notification&APIs&that&are&running&before&or&during&explorer&startup&should&listen&for&the&notification&message&that&indicates&the&taskbar&is&ready&to&receive&API&calls.&This&is&the&“TaskbarCreated&“&message.&This&also&enables&your&application&to&re-register&if&the&explorer&is&re-started.
This&is&described&in&the&section&titled&“Taskbar&Creation&Notification”&on&this&page:
/en-us/library/cc144179(VS.85).aspx
还有这样一个问题:360如何做到在win7下默认显示到右下角的可见的托盘区域的?
----------------------------------------------------------------------------------------------------------------
1、Win7下为了不让程序托盘侵占太多的右下角空间,默认把托盘图标隐藏在小箭头下托盘溢出区域的。&有时候用户不知道某程序已经启动,且隐藏在小箭头下面,所以就需要提示用户,比如QQ,酷狗都会弹出一个框框告诉用户把QQ的托盘设置出来。&但是有些程序做到了默认显示,比如360,dropbox.
2、&小箭头打开后的用来保存隐藏的托盘图标的窗口是NotifyIconOverflowWindow窗口,正常显示的是TrayNotifyWnd窗口下可见托盘区域,两个之间都支持直接拖拽,感觉可以模拟拖拽,但是不知怎么实现。
不错了,学习了
不错了,学习了
销售一抖&&啥都带走
不错&楼主有完美精神&
学习,关注ing
学习下,都没关注这个问题
看看是怎么弄的。、
第一,图标消失,单就QQ我无论在XP还是WIN7都没有出现过,请先检查程序逻辑,是否自己无意中删了notify&icon
第二,你的检测方法不靠谱,需要想办法先刷新图标栏()
第一,图标消失,单就QQ我无论在XP还是WIN7都没有出现过,请先检查程序逻辑,是否自己无意中删了notify&icon
第二,你的检测方法不靠谱,需要想办法先刷新图标栏()
QQ肯定添加了很多保护措施;另外,和刷新图标栏应该没关系
国外的论坛中,有提出到注册表项
HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify中,分析&IconStreams和&PastIconsStream文件的内容,但是这是微软不公开的,也是严格禁止的,也没有相关的代码可供参考
再就是,为什么在64位机器上检测失败,是由于TBBUTTON结构体:
typedef&struct&_TBBUTTON&{
&&&&int&iB
&&&&int&idC
&&&&BYTE&fsS
&&&&BYTE&fsS
#ifdef&_WIN64
&&&&BYTE&bReserved[6];&&&&&&&&&&//&padding&for&alignment
#elif&defined(_WIN32)
&&&&BYTE&bReserved[2];&&&&&&&&&&//&padding&for&alignment
&&&&DWORD_PTR&dwD
&&&&INT_PTR&iS
}&TBBUTTON,&NEAR*&PTBBUTTON,&*LPTBBUTTON;
在32位和64位程序中的内存分布是不一样的,所以对于32位的程序在64位的操作系统上运行,是要重新计算偏移的
学习来了,表示还没有读懂代码
不是这个问题引起的,其他图标都是正常的,就是我们应用程序托盘图标出异常消失了!
想找win7下刷新托盘图标的代码win7创建还原点在哪?nd40_百度知道
win7创建还原点在哪?nd40
点击配置3://g.com/zhidao/wh%3D600%2C800/sign=/zhidao/wh%3D450%2C600/sign=cadab570e6cd7b89ee91/5d6034a85edf8db1d5cec9dee74a3.hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.选中还原系统设置和以前版本的文件<a href="/zhidao/pic/item/5d6034a85edf8db1d5cec9dee74a3.hiphotos://g.baidu://g.baidu.baidu.jpg" esrc="http.hiphotos1.点击系统保护2
其他类似问题
您可能关注的推广
还原点的相关知识
其他2条回答
在系统备份里面
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 win7怎么查看注册表 的文章

 

随机推荐