如何关闭CBox(2.4版本)的强制升级窗口

        今天启动2.4.0.9版本的CBox,提示检测到新版本,必须更新到新版本后才能使用,提示窗口如下所示。此次升级是强制升级,如果选择不升级(点击升级提示窗口中右下角的“退出按钮”或者右上角的“关闭”),此时整个CBox程序都会退出,从而导致CBox没法使用。

        由于是强制性的,所以没办法只能升级,结果升级后,新版本的CBox(3.0版本)竟然比2.4版本的难用的多,而且内容也少了很多,再就是新版本的界面效果与2.4相比特别难看。真搞不懂,央视做CBox请的是哪家公司,竟然把CBox做的越来越烂了,审美观念严重有问题,更别说用户体验了。2.4版本界面与3.0的新版本界面如下所示。


       所以还是装回了2.4的版本,但是启动后要强制升级啊,不升级就没法使用。于是尝试着找一些方法看时候能将CBox的升级功能给屏蔽掉。比如如果有包含版本号的配置文件或者注册表信息,直接将版本号修改成最新的(或者是很大的版本号),但是找了半天也没找到,包括显示所有的掩藏文件以及到C:\Documents and Settings\XXXXX\Application Data\CBox目录都去找了。然后看了一下安装目录下是否有类似于Updater.exe升级exe文件,如果有直接将之删除掉,这样CBox就没发进行版本检测了。很不幸的是,exe也没有,倒是有一个Updater.dll动态库文件,这个文件删不得的,因为CBox.exe会依赖这个库,如果将之删除,CBox.exe启动时会报缺少Updater.dll动态库文件。

        尝试到这里,依旧没有办法阻止CBox的强制升级。是不是没有办法了呢?仔细的看了一下,弹出的提示框是非模态的,主窗口还是能操作的。于是想到一个稍微麻烦一点的办法,既然你能捕捉到用户点击关闭和退出的事件,那么我是不是可以尝试一下得到升级提示窗口的句柄,直接将提示窗口销毁掉,从而使之不影响CBox的使用呢?于是用VC自带的Spy++工具抓到了升级窗口的类名(UpdateWindow)和标题名(Update),那么我可以调用系统API函数EnumWindows,枚举一下当前的所有的窗口,与升级提示窗口的类名及标题名比对,如果相同的话,对应的句柄就是升级提示窗口的句柄,直接给这个句柄发送WM_CLOSE消息,直接将之关闭掉。代码写好后测试了一下,果然可以达到我们想要的效果,升级提示窗口销毁了,主窗口可以正常的使用。相关的代码如下所示:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. BOOL CALLBACK EnumWindowsProc(  
  2.     HWND hwnd,      // handle to parent window  
  3.     LPARAM lParam   // application-defined value  
  4.     )  
  5. {  
  6.     TCHAR achClassName[MAX_PATH] = { 0 };  
  7.     ::GetClassName( hwnd, achClassName, sizeof(achClassName)/sizeof(TCHAR) );  
  8.   
  9.     TCHAR achWndTitle[MAX_PATH] = { 0 };  
  10.     ::GetWindowText( hwnd, achWndTitle, sizeof(achWndTitle)/sizeof(TCHAR) );  
  11.   
  12.     if ( !_tcscmp( achClassName, _T("UpdateWindow") ) &&   
  13.         !_tcscmp( achWndTitle, _T("Update") ) )  
  14.     {  
  15.         ::SendMessage( hwnd, WM_CLOSE, 0, 0 );  
  16.         int i = 0;  
  17.     }  
  18.   
  19.     return TRUE;  
  20.   
  21. }  
  22.   
  23. void CTestCBoxWndDlg::OnBnClickedBtnTest()  
  24. {  
  25.     ::EnumWindows( EnumWindowsProc, NULL );  
  26. }  

        这样做就稍微麻烦一点,每次启动CBox后都会弹出升级提示窗口,然后我们需要启动我们的工具软件将升级提示窗口销毁掉。但是这也是没办法的办法。再就是有时不注意点击了更新,或者别用使用了我的电脑给我更新了,这样事后我还得手动装回老版本。无意中发现CBox安装目录下有个DuiLib.dll文件,哈哈,原来CBox使用duilib库实现的。并且图片文件和xml配置文件就在安装目录的\skin\default目录下,为了避免点击到更新,我们可以将提示窗口对应的update.xml中最顶层的布局的Visible属性改为false,这样虽然升级提示窗口还会显示,但是窗口只有背景图片,其他的按钮控件的什么都不显示了,这样就不会点击到更新按钮的机会了。update.xml文件的内容如下所示,至修改了一个地方:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <Window size="246,163" caption="0,0,0,26"  roundcorner="3,3" showdirty="false" >  
  3.   <Font name="微软雅黑" size="10" />  
  4.   <Font name="微软雅黑" size="13" />  
  5.   <Font name="微软雅黑" size="14" />  
  6.   <Font name="宋体" size="13" bold="true" />  
  7.   <Font name="宋体" size="12" bold="true" />  
  8.   <Font name="宋体" size="12" />  
  9.   <Font name="宋体" size="14" bold="true" />  
  10.   <Font name="微软雅黑" size="8" />  
  11.   <Default name="Edit" value="enabled="false" bordercolor="#FF000000" bordersize="1" font="8" textcolor="#FF666666"/>  
  12.   <Default name="Label" value="align="left"" />  
  13.   <Default name="SkinOption" value="group="skin_group" maxwidth="82" align="left" textpadding="46,0,0,0" normalimage="file='uiitem.png' source='0,0,13,13' dest='22,3,35,16'" selectedimage="file='uiitem.png' source='13,0,26,13' dest='22,3,35,16'" disabledimage="file='uiitem.png' source='26,0,39,13' dest='22,3,35,16'"/>  
  14.   
  15.   <VerticalLayout   bkimage="update_bk.png"  visible="false">  // 就改了这一个地方,添加了visible="false"  
  16.             <HorizontalLayout  height="30">  
  17.               <Button name="btnclose11" padding="225,10,0,0" width="11" height="11" normalimage="file='pt_close.png' source='0,0,11,11'" hotimage="file='pt_close.png' source='11,0,22,11'" pushedimage="file='pt_close.png' source='22,0,33,11'"/>  
  18.             </HorizontalLayout>  
  19.           <HorizontalLayout name="containers"  height="110"  padding="0,0,0,0" bordersize="0">  
  20.               <VerticalLayout name="normal">          
  21.                 <HorizontalLayout  padding="0,5,0,0">  
  22.                   <Label name="lblprompt"  padding="10,3,0,0" text="" align="left" textcolor="#FFFFFFFF" font="1"/>  
  23.                 </HorizontalLayout>  
  24.                 <HorizontalLayout  height="45" padding="0,0,0,0">  
  25.                   <Progress name="pgsdownload"  padding="12,3,0,0" value="50"  height="18" textcolor="#FFFFFFFF" font="0" foreimage="pc_playprogressfront.png"  bkimage="pc_playprogressbk.png" />  
  26.                 </HorizontalLayout>  
  27.               </VerticalLayout>  
  28.           </HorizontalLayout>  
  29.         <HorizontalLayout padding="1,0,1,30" height="28">  
  30.          <HorizontalLayout width="180">  
  31.             <Button name="btnupdate" padding="125,0,0,5" width="48" height="18" visible="false" text="更新" textcolor="#FFA0A0A0" hottextcolor="#FFE5E5E5" disabledtextcolor="#FFA7A6AA" normalimage="buttonblack.png" hotimage="buttonblack.png" pushedimage="buttonblack.png" />  
  32.           </HorizontalLayout>  
  33.          <Button name="btncancel" padding="8,0,0,5" width="48" height="18" text="退出" textcolor="#FFA0A0A0" hottextcolor="#FFE5E5E5" disabledtextcolor="#FFA7A6AA" normalimage="buttonblack.png" hotimage="buttonblack.png" pushedimage="buttonblack.png" />  
  34.         </HorizontalLayout>  
  35.   </VerticalLayout
在Python中调用Combobox的值,你可以使用get()方法来获取用户选择的值。根据你提供的代码片段,你可以在绑定选择事件的函数中使用box.get()来获取当前选择的值。然而,你提到这种方法不起作用,可能是因为你没有正确地绑定选择事件或者没有正确地调用该函数。 你可以尝试以下步骤来解决这个问题: 1. 确保你正确地导入了tkinter和ttk模块,并正确地创建了Combobox部件。 2. 确保你正确地绑定了选择事件。你可以使用bind方法来绑定事件,例如:box.bind("<<ComboboxSelected>>", your_function)。在your_function中,你可以使用box.get()来获取当前选择的值。 3. 确保你正确地调用了你绑定的函数。你可以在程序启动时手动调用该函数,以确保它能够正确地获取当前选择的值。 希望这些步骤能够帮助你解决问题。如果问题仍然存在,请提供更多的代码和错误信息,以便我们能够更好地帮助你。\[2\] #### 引用[.reference_title] - *1* [python – 从Tkinter中的combobox中获取所选值](https://blog.csdn.net/weixin_39664585/article/details/111438531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [关于python-tkinter-ttk-Combobox详解](https://blog.csdn.net/Z_love_u/article/details/109292907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [从零开始编写一个上位机(串口助手)QT Creator + Python](https://blog.csdn.net/believe666/article/details/128425211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值