以下转载自:
http://blog.csdn.net/jun_01/archive/2006/07/31/1005475.aspx
1,今天看到一篇文章,号称中国大多数 的软件都存在一个bug。 据说,具有托盘图标的软件,如果把系统的explorer.exe进程杀掉,然后重新开一个这个进程(本人经常采用此方法来释放内存)。微软的软件或者国 外大部分软件,都可以自动恢复托盘图标,而大多数国产软件却不能恢复。对于很多隐藏了主界面的软件,这是一个恶梦。
我做了一下试验,操作系统自带的那些图标都可以恢复,另外一个国外免费的过滤垃圾邮件软件也正常,但金山词霸和输入却似乎恢复不了。当然我自己的程序也有问题。其实解决方法很简单,只要注册一个叫“TaskbarCreated”的消息,并响应它就可以了。
2, 关于防止程序运行多个实例,如果有人在搜索引擎里搜索一下,就会发现和这个话题相关的文章太多了。当然,这些文章有90%的相似度,并且都是delphi 和vb的。很明显是似乎抄袭的。并且里边的内容也没用。全是用FindWindow,这样太不保险了。因为一个窗体的标题实在容易改变,而且容易重复。
而我采用的是用共享数据段的方法,其实代码量不多,使用也方便。我只记得以前用过,但现在忘了,于是我花了半个小时在网络上搜索,一无所获后,又在自己的硬盘里找,又过了大约30分钟,我终于找到了,看来很有必要备忘一下:
HWND volatile g_hPreWnd = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:sharedata,RWS")
HINSTANCE g_hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if (g_hPreWnd != NULL){
ShowWindow(g_hPreWnd, SW_SHOWNORMAL);
SetForegroundWindow(g_hPreWnd);
return 0 ;
}
.
.
.
由于调试时写错了comment中的段名,编译选项和段申明不一致,导致出不了效果,我一度怀疑这个方法只在dll中有效,因为我之前使用它也是在hook的dll中,而网上的文章也都是介绍dll间共享数据的。但真正解决问题后,我才发现了实践出真知的快感。