许多国产软件共存的bug!

原创 2002年05月20日 10:05:00

许多国产软件共存的bug!

    为了说明这个问题,我测试了下面的软件,我的机器是p3-450,192mb,win2000:
天网防火墙2.4.8,
腾讯QQ简体标准版2000C Build 0305b
简体测试版QQ2000C Build 0510
金山公司的金山词霸2002,
foxmail 4.1

    当上述程序运行后,它们会在屏幕的右下脚的托盘中增加一个小图标,当我们打开进程管理器时,把系统的explore.exe结束,这时windows下的任务栏和开始菜单就消失了,这是我们再能过进程管理器运行ie(我的是在D:/WINNT/explorer.exe),这时windows下的任务栏和开始菜单就又出现了,但是我们注意到原来的一些程序在屏幕的右下脚的托盘中增加一个小图标不见了,但是该程序的进程仍在进程管理器中可见,这是问题就出现了,我们的程序就无法在用户的控制下运行了。经测试上述软件除foxmail 4.1存活下回去,其它无一幸免。同时我还测试了一下国外的一软件,如诺顿,winmap等,做同样的测试,它们的程序图标在ie恢复后仍可出现在任务栏中。而且存在bug的程序远不止这些程序,只要是在屏幕的右下脚的托盘中增加一个小图标的程序80%都存在这个问题。我写这篇文章的目的就是要告诉大家,这个bug很容易修复的,以一个基于对话框的vc++6.0程序为例,
首行应在对话框类中加入如下变量。  
NOTIFYICONDATA m_tnid;
再定义一个全局变量
#define MYWM_NOTIFYICON (WM_USER+100)

我们知道,写一个托盘程序就要在OnInitDialog()中加入如下代码就可以了
 m_tnid.cbSize=sizeof(NOTIFYICONDATA);
 m_tnid.hWnd=AfxGetMainWnd()->m_hWnd;
 m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
 m_tnid.uCallbackMessage=MYWM_NOTIFYICON;
 strcpy(m_tnid.szTip,"Only 1.99 $");
 m_tnid.uID=IDR_MAINFRAME;
 HICON hIcon;
 hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 m_tnid.hIcon=hIcon;
 ::Shell_NotifyIcon(NIM_ADD,&m_tnid);
 if(hIcon)::DestroyIcon(hIcon);
这时运行程序,就会在系统托盘中加入一个我们的图标, 但是我们退出程序时那个右下
脚的图标并不会消失,只有把鼠标移到图标那里图标才会消失。我们可以重载程序的
关闭窗口函数,在OnCancel() 函数中加入
 NOTIFYICONDATA tnid;
 tnid.cbSize=sizeof(NOTIFYICONDATA);
 tnid.hWnd=AfxGetMainWnd()->m_hWnd;
 tnid.uID=IDR_MAINFRAME;//保证删除的是我们的图标
 Shell_NotifyIcon(NIM_DELETE,&tnid);
这时我们退出程序时,屏幕的右下脚的托盘中增加一个小图标也会随之消失。也许许多人包括我在内,都会觉得我样的程序就很完美了,但是当有时ie执行了非法操作被关闭时,我们重新恢复ie时刚才写过的程序的光标在任务栏中不见了。也许你会说我们的程序在任务栏中还有最小化的窗口,的确我们写是程序是这样的,但是我们测试的程序在最小化以后在任务栏中是没有窗口的如果是这样,当它们的小图标在屏幕的右下脚的托盘中消失后,一般情况下你是无法让它们再出来了。当然你是高手你可以自己写个程序,找到那个消失光标的程序的句柄,用一个showwindow让它出来,但是通常你不得不再用进程管理器重新结束那此程序的进程。这就是上述国产软件的通病。也许这样并不会造成什么损失,不过有一次我用sterm 1.0 bet时挂在上面2天,结果因为ie掉死了所以2天的48小时的时间就没有加到我的经验值里。不过现在的sterm 就没有这个bug了。那么我们该怎么解决这个问题呢。其实很简单。
在csdn的讨论中,经过 jiangsheng(蒋晟卧病中)的帮助,我得出结论
我们只要在全局const UINT WM_TASKBARCREATED =
    ::RegisterWindowMessage(_T("TaskbarCreated"));//这个消息是系统开始菜单,任务栏创建时发出的
    再加上消息映射表
        ON_REGISTERED_MESSAGE(WM_TASKBARCREATED,
                          OnTaskBarCreated)
OnTaskBarCreated()函数如下:
afx_msg void OnTaskBarCreated();

void CTianWangDlg::OnTaskBarCreated()
{
m_tnid.cbSize=sizeof(NOTIFYICONDATA);
 m_tnid.hWnd=AfxGetMainWnd()->m_hWnd;
 m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
 m_tnid.uCallbackMessage=MYWM_NOTIFYICON;
 strcpy(m_tnid.szTip,"Only 1.99 $");
 m_tnid.uID=IDR_MAINFRAME;
 HICON hIcon;
 hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 m_tnid.hIcon=hIcon;
  ::Shell_NotifyIcon(NIM_ADD,&m_tnid);
}

这时现运行我们的程序,重复开始的过程,当ie恢复时我们的图标又会在系统托盘中出现了。

我的Email是sunyuzhe@263.net 欢迎与大家讨论。

我是一个尽量少用国产软件的软件开发工程师

[作者] 网名: 猪头三 站点: http://www.x86asm.com Email: 643439947@qq.com QQ: 643439947 编程生涯: 2001~至今[15...
  • Code_GodFather
  • Code_GodFather
  • 2016年07月25日 10:18
  • 4189

中国已取消政府采购优先国产软件的政策

  据消息人士周四透露,在国际压力和内部人士的批评下,中国已经取消了歧视外国公司的软件采购政策。  人们早就预期中国国务院将在今年夏天宣布一项新政策,要求各部门和国有企业采购软件的一定比例是中国企业制...
  • tanaya
  • tanaya
  • 2004年08月17日 09:25
  • 1703

最优秀的一到五个国产软件

【此篇文章是由自动发信系统所张贴】 ⊙ 投票开启于:Wed Dec 25 22:09:12 2002  类别:问答 ⊙ 主题:[投票]本年度优秀国产软件评选 ⊙ 票选题目描述:  ...
  • junecau
  • junecau
  • 2011年11月06日 17:14
  • 1059

Ubuntu常用软件大全(国内用户比较常用的软件)

输入法平台 每个输入法平台都能加装很多种类输入法(如二笔、五笔、拼音) ibus 官网 (K)Ubuntu9.10之后预设输入法平台,为取代停滞的scim创造 ...
  • s464036801
  • s464036801
  • 2012年11月30日 14:17
  • 1423

国产软件为什么越来越流氓?

这是一个劣币驱逐良币的过程,这是一个逼上梁山的过程。 作者以十几年的从业经历为你梳理出中国软件收费方式发展的过程,最后揭示出国产软件流氓化的原因。...
  • SunnyChen
  • SunnyChen
  • 2015年03月05日 00:45
  • 3932

ionic1.3.1迄今为止遇到的bug

ionic1.3.1迄今为止遇到的bug1.ionic-view的cache参数用来控制页面是否缓存,ionic-view页面的缓存机制非常好,当你的页面数据比较多或者业务很复杂时,页面的缓存机制避免...
  • hexinming
  • hexinming
  • 2017年01月01日 22:02
  • 227

国内管理软件何时超越国际领先同行之本人拙见

以上看到诸位仁兄在讨论国内ERP在内的企业级管理软件是否能赶上国际领先企业管理软件软件的话题,本人在读研期间曾是《南方周末》天下版的特约撰稿人,毕业之后在四大会计师事务所之一的普华永道从事企业IPO的...
  • Candy_MMyy
  • Candy_MMyy
  • 2017年03月18日 13:31
  • 337

远离国产!windows唯一推荐杀毒软件-Avast

警示!请不要安装360任何产品!珍爱生命,远离360,包括360杀毒、360卫士、360安全浏览器!严重鄙视监管用户隐私、扫描用户硬盘的行为。 avast已有数十年做杀毒软件的历史,在国外市场有很大...
  • huangbangqing12
  • huangbangqing12
  • 2016年01月01日 14:47
  • 1178

xcode IOS开发中如何让APP的不同版本共存于设备上

简单修改下工程的Genneral设置即可,版本相关 Xcode 9.1 Build version 9B55 如图,修改Bundle Identifier即可,如test,test-beta,...
  • gcola007
  • gcola007
  • 2017年11月27日 10:38
  • 78

许多大量 英文表达

都能修饰 plenty of a large quantity of、a good supply of 、 不可数名词 a great deal of a large amount of, qu...
  • u014772182
  • u014772182
  • 2014年05月19日 21:19
  • 1704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:许多国产软件共存的bug!
举报原因:
原因补充:

(最多只允许输入30个字)