当前位置: 首页 > 编程日记 > 正文

一种将快捷方式从开始菜单“常用应用”的中去除的方法

当我们安装一款软件的时候,这款软件的一些快捷方式可能被设置到开始菜单的“常用应用”区域。但是,如果是“卸载”快捷方式被“钉”到该区域,就会造成非常不好的体验。毕竟把“卸载”接口暴露得如此醒目,如同把该款软件的地狱大门暴露出来。(转载请指明出于breaksoftware的csdn博客)

如下图,python就将卸载程序放到了“常用区域”。从而会导致windows会将该快捷方式放到“常用应用”区域。

一种解决方案就是,不将“卸载”快捷方式放到开始菜单的“普通区域”。很多应用都是使用这种方式。

另一种就是如何将该项从“常用应用”区域删除。本文就是讲解这套方案的研究和分析。

首先,我们使用RegSnap抓取一次注册表快照。然后在”常用应用“区域删除notepad++的启动快捷方式,再生成一次快照。对比两次快照。我们可以得出如下结果:

Deleted keys
HKEY_USERS\S-1-5-21-3689171631-189274284-2341753515-176562\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\70
HKEY_USERS\S-1-5-21-3689171631-189274284-2341753515-176562\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}\Count\{0139Q44R-6NSR-49S2-8690-3QNSPNR6SSO8}\Abgrcnq++\Abgrcnq++.yax

从对比图中,我们可以看到一个叫Abgrcnq++.yax被删除了。这个是个非常有意思的名字,我们可以看出来,这个名字明显是被加密的,但是加号和点号没有被加密。我又观察了其他的键(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count下)

从后缀rkr可以想象,这个可能是exe的加密结果。后来我做了下计算,发现字符间存在13的差值。后来才知道这个就是所谓的ROT13置换转换码。该算法的详细介绍可以见

http://baike.baidu.com/link?url=a3UL0bMbmzzINfomfkCgTHyUOQDwBk83WkEjcgH6gZdvproZg7OTcXkt6G3oLLFpZnBXwXWhFWeGhqXBN8Tuhq

后来,我又做了一个实验——删除了HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}\Count的一个键,该键对应的快捷方式在开始菜单的”常用应用“区域。发现,该键被删除后,该快捷方式就消失了。

以下是测试代码:

// RegExplorerUserAssist.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <windows.h>
#include <string>/*
Registry value names are limited to 32,767 bytes. 
The ANSI version of this function treats this parameter as a SHORT value. 
Therefore, if you specify a value greater than 32,767 bytes, there is an overflow and the function may return ERROR_MORE_DATA.
*/
#define MAX_VALUE_NAME 16383// http://baike.baidu.com/link?url=a3UL0bMbmzzINfomfkCgTHyUOQDwBk83WkEjcgH6gZdvproZg7OTcXkt6G3oLLFpZnBXwXWhFWeGhqXBN8Tuhqstd::wstring ConvertData( LPCWSTR lpBuffer, DWORD dwLength ) {std::wstring wstrValueName;for ( DWORD dwIndex = 0; dwIndex < dwLength; dwIndex++ ) {WCHAR wchSingle = *( lpBuffer + dwIndex );unsigned char ucsa = LOBYTE(WCHAR('a'));unsigned char ucsz = LOBYTE(WCHAR('z'));unsigned char ucbA = LOBYTE(WCHAR('A'));unsigned char ucbZ = LOBYTE(WCHAR('Z'));if ( ( WCHAR('a') <= wchSingle && WCHAR('z') >= wchSingle ) || ( WCHAR('A') <= wchSingle && WCHAR('Z') >= wchSingle )  ) {unsigned char uc = LOBYTE(wchSingle);if ( ucsa <= uc && ucsz >= uc ) {uc = ( ( uc + 13 ) > ucsz  ) ? uc - 13 : uc + 13;}else if ( ucbA <= uc && ucbZ >= uc ) {uc = ( ( uc + 13 ) > ucbZ  ) ? uc - 13 : uc + 13;}wchSingle = WCHAR(MAKELONG(uc,0));}wstrValueName.append( &wchSingle, 1 );}#ifdef DEBUGstd::wstring wstrOutput = wstrValueName;wstrOutput.append( WCHAR('\n'), 1);OutputDebugStringW(wstrOutput.c_str());
#endifreturn wstrValueName;
}BOOL DeleteValue(HKEY hKey, const std::wstring& wstrSubString) 
{ WCHAR wchValueName[MAX_VALUE_NAME] = {0};LPWSTR lpValueNameBuffer = wchValueName;DWORD dwValueNameBufferLength = ARRAYSIZE(wchValueName);BOOL bSuc = FALSE;do {DWORD    dwValuesCount = 0;              // number of values for key DWORD    dwMaxValueNameLen = 0;          // longest value name // Get the class name and the value count. LONG lretCode = RegQueryInfoKey( hKey,NULL, NULL, NULL, NULL, NULL, NULL, &dwValuesCount, &dwMaxValueNameLen, NULL, NULL, NULL );if ( ERROR_SUCCESS != lretCode ) {break;}// Enumerate the key values.if ( 0 != dwValuesCount) {for ( DWORD dwIndex = 0; dwIndex < dwValuesCount; dwIndex++ )  { DWORD dwValueNameInlineLength = dwValueNameBufferLength;wmemset( lpValueNameBuffer, 0, dwValueNameInlineLength);lretCode = RegEnumValue(hKey, dwIndex, lpValueNameBuffer, &dwValueNameInlineLength, NULL, NULL, NULL, NULL);if ( ERROR_NO_MORE_ITEMS == lretCode ) { // SucbSuc = TRUE;break;} if ( ERROR_MORE_DATA == lretCode ) {if ( wchValueName != lpValueNameBuffer ) {if ( NULL != lpValueNameBuffer ) {delete [] lpValueNameBuffer;lpValueNameBuffer = NULL;}}lpValueNameBuffer = new WCHAR[dwValueNameInlineLength];dwValueNameBufferLength = dwValueNameInlineLength;dwIndex--;}if ( ERROR_SUCCESS == lretCode ) {std::wstring wstrValueName = ConvertData( lpValueNameBuffer, dwValueNameInlineLength );if ( std::wstring::npos == wstrValueName.find( wstrSubString.c_str() ) ) {continue;}else {bSuc = RegDeleteValue( hKey, wstrValueName.c_str() );break;}}}}} while (0);if ( lpValueNameBuffer != wchValueName ) {delete [] lpValueNameBuffer;lpValueNameBuffer = NULL;}return bSuc;
}int _tmain(int argc, _TCHAR* argv[])
{HKEY hTestKey;if( RegOpenKeyEx( HKEY_CURRENT_USER,TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}\\Count"),0,KEY_READ,&hTestKey) == ERROR_SUCCESS){DeleteValue(hTestKey, L"\\360安全中心\\360安全卫士\\360安全卫士.lnk");}return 0;
}

有一点需要说明——XP下不是该注册表路径。如果想将方案移植到XP上,使用相同的方法应该可以得出注册表路径。

最后附上工程代码。

相关文章:

ISA---不能访问网址或是多次刷新才能访问的解决方法一则

当你安装ISA2006在WINDOWS 2003 SERVER上&#xff0c;并打上SP2补订时。遇SNAT客户端不能访问WEB&#xff0c;但能PING通&#xff0c;能TELNET通&#xff0c;也能访问QQ或是MSN的问题时可以利用以下方法解决。同时&#xff0c;如果你遇到在此环境下&#xff0c;客户端访问外部网…

《评人工智能如何走向新阶段》后记(深谈人工智能发展前沿)

由AI科技大本营下载自视觉中国来自国内外的跟贴留言 深谈人工智能发展前沿 自从我们发表《评人工智能如何走向新阶段》一文以来&#xff0c;至今约5个月&#xff0c;引来了中外专家、草根们的大量跟贴留言&#xff08;也有人转录他人的公开言论作为跟贴来发表的&#xff09;。…

URAL 2027 URCAPL, Episode 1 (模拟)

题意&#xff1a;给你一个HxW的矩阵&#xff0c;每个点是一个指令&#xff0c;根据指令进行一系列操作。 题解&#xff1a;模拟 #include<cstdio> #include<algorithm> using namespace std;const int maxn 101; char G[maxn][maxn];int dx[] {-1,0,1, 0}; int d…

使用WinHttp接口实现HTTP协议Get、Post和文件上传功能

我实现了一个最新版本的接口&#xff0c;详见《实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现》。还有基于libcurl实现的版本《实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现》。以下是原博文&#xff1a; 我们在做项目开发时&#xff0c;往往会…

收藏 | 一文带你总览知识蒸馏,详解经典论文

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者&#xff1a;凉爽的安迪来源 | 深度传送门&#xff08;ID&#xff1a;deep_deliver&#xff09;【导读】这是一篇关于【知识蒸馏】简述的文章&#xff0c;目的是想对自己对于知识蒸馏学习的内容和问题…

[工具推荐]用了TrueCrypt 再无难掩之隐

缘起&#xff1a;混在网络n多年了&#xff0c;手头总有些东西不想被别人看到的东西&#xff0c;由于小弟人品好&#xff0c;相貌佳&#xff0c;总有很多朋友喜欢用我的电脑玩啊玩啊……。 近日&#xff0c;冠希、柏芝等前辈以身示法&#xff0c;为我等上了很好一堂关于隐私保护…

利用phpmailer类邮件发送

<?phprequire("class.phpmailer.php"); //下载的文件必须放在该文件所在目录$mail new PHPMailer(); //建立邮件发送类$address "接收方邮箱"; //接收方地址$mail->IsSMTP(); //使用SMTP方式发送$…

据说这是大多数人【减肥】的真实写照

有句诗说得好 “冬天不减肥&#xff0c;夏天徒伤悲” 在这个人人储存脂肪的季节绝对是你甩掉脂肪的好时机&#xff08;毕竟这是一个拼颜值的时代颜值是天生的&#xff0c;可是身材绝不能输&#xff09;但是 据说大多数人的减肥经历其实是这样的减肥第一步管住嘴&#xff0c;迈开…

PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法

在日常应用中&#xff0c;某些程序往往会被第三方程序下钩子(hook)。如果被下钩子的进程是我们的进程&#xff0c;并且第三方钩子严重影响了我们的逻辑和流程&#xff0c;我们就需要把这些钩子摘掉(Unhook)。本件讲述一种在32位系统上&#xff0c;如何摘掉API钩子的思路和方法。…

设置列表字段为主键

转贴:Sample event handler to set a field as a pr imary key (enforce no duplicates) Got this as a request from a reader- how to prevent users from adding items with same titles as ones that already exist in the list. Codeusing System;using System.Collectio…

谁登录了你的linux

最近有一台数据库服务器自动重启。查了一下相关登录信息&#xff1a;查看linux下的用户登录日志&#xff0c;包括用户登录时所用的主机的ip&#xff1a;more /var/log/secure who /var/log/wtmp干了些什么&#xff1f; root账户下输入su - username 切换到username下输入 histo…

一种使用GDI+对图片尺寸和质量的压缩方法

今天同事向我询问图片压缩的算法&#xff0c;我想起大概两三年前做过的一个项目。其中包含了尺寸和质量两种压缩算法&#xff0c;并且支持JPEG、bmp、PNG等格式。今天把这段逻辑贴出来&#xff0c;供大家参考。&#xff08;转载请指明来源于breaksoftware的CSDN博客&#xff09…

.NET企业级应用架构设计系列之应用服务器

本文属spanzhang&#xff08;张友邦&#xff09;原创&#xff0c;发布地址为&#xff1a;http://blog.csdn.net/spanzhang。转载或引用请注明原文之出处&#xff0c;谢谢&#xff01; .NET企业级应用架构设计系列之开场白 .NET企业级应用架构设计系列之技术选型 这里要说到的…

编程语言发展70年,用50种不同语言输出「Hello World」

「免费学习 60 节公开课&#xff0c;投票页面&#xff0c;点击讲师头像」作者 | Sylvain Saurel译者 | 风车云马责编 | 屠敏【导读】历经 70 年&#xff0c;不断出现的编程语言为开发者解决了哪些难题&#xff1f;其存在又有怎样的特性&#xff1f;本文将以「Hello World」为例…

函数循环的理解

2019独角兽企业重金招聘Python工程师标准>>> var ulObjdocument.getElementById("box"); var lisObjulObj.getElementsTagname("li"); for(var i0;i<lisObj.length;i) { lisObj[i].οnclickfunction()//循环时对应节点绑定事件&#xff0c;事…

从LeNet到GoogLeNet:逐层详解,看卷积神经网络的进化

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | MrCharles来源 | CSDN原力计划获奖作品&#xff08;*点击阅读原文&#xff0c;查看作者更多文章&#xff09;前言深度学习的兴起使卷积神经网络在计算机视觉方面大放异彩&#xff0c;本文将按时间…

Windows客户端C/C++编程规范“建议”——前言

前言 工作中接触了很多编程规范。其中最有意思的是&#xff0c;公司最近发布了一版C/C编程规范&#xff0c;然后我看到该规范的最后一段时&#xff0c;有这么一句&#xff1a;“该规范不适用于Windows平台开发”。看来这份规范是由做其他平台开发的同学制定的。那么做Windows开…

storm入门教程 第一章 前言[转]

1.1 实时流计算 互联网从诞生的第一时间起&#xff0c;对世界的最大的改变就是让信息能够实时交互&#xff0c;从而大大加速了各个环节的效率。正因为大家对信息实时响应、实时交互的需求&#xff0c;软件行业除了个人操作系统之外&#xff0c;数据库&#xff08;更精确的说是…

Windows客户端C/C++编程规范“建议”——函数

1 函数 1.1 代码行数控制在80行及以内 等级&#xff1a;【要求】 说明&#xff1a;每个函数的代码行数控制应该控制在80行以内。如果超过这个限制函数内部逻辑一般可以拆分。如果试图超过这个标准&#xff0c;请列出理由。但理由不包含如下&#xff1a; 无法拆分。流程内部…

把自己朝九晚五的工作自动化了,有错吗?

作者 | Brian Merchant译者 | 谭开朗编辑 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】用代码让自己工作开启自动化之际&#xff0c;是否意味着自己将面临被解雇的风险&#xff1f;2016年&#xff0c;Reddit上出现了一个匿名的帖子&#xff0c;内…

COM组件转换成.NET组件[转]

利用类型库导入器(Type Library Importer)可以将其包装成一个.NET组件&#xff0c;然后就可以像使用.NET组件一样使用它了。 .NET框架只是提供了一个包装&#xff0c;并没有真正改变原有的对象 1.找到要转换的.dll文件 2.在命令提示符窗口中输入.dll文件的文件路径&#xff0c;…

干货:Android 源码使用心得分享

我相信很多初学者会和我一样经常在网上去找Android开发源码&#xff0c;但是往往因为运行不起来非常的懊恼&#xff01;在做爱开发网站的时候&#xff0c;收集App代码时就遇到了这种困难&#xff0c;我相信网络上面的源码大部分在发布前都会人工测试&#xff0c;能够正常运行才…

60分钟入门深度学习工具PyTorch

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | Soumith Chintala中文翻译、注释制作 | 黄海广配置环境&#xff1a;PyTorch 1.3&#xff0c;python 3.7&#xff0c;主机&#xff1a;显卡&#xff1a;一块1080ti&#xff1b;内存&#xff1a;32g…

Windows客户端C/C++编程规范“建议”——指针

2 指针 2.1 尽量使用智能指针 等级&#xff1a; 【推荐】说明&#xff1a;正确使用智能指针可以省去指针管理的工作。2.2 类成员变量指针释放后一定要置空 等级&#xff1a; 【必须】说明&#xff1a;如果类成员变量指针在释放后没有置空&#xff0c;将出现如下问题&#xff1…

Bug tracker .net 部署经验(完善中)

Bug tracker .net 部署经验1. 软件要求windows 2003 serverSP1IISSQL sever 2005Net framework2. 安装和配置Bug tracker .net 提供了一个readme 文件。解压安装文件至某一个目录。在SQL SERVER 2005中新建一个数据库。确保IIS工作正常。定义一个虚拟目录&#xff0c;将其指向安…

Windows客户端C/C++编程规范“建议”——函数调用

3 函数调用 3.1 谨慎使用递归方法 等级&#xff1a; 【推荐】说明&#xff1a;递归方式控制不当&#xff0c;可能会导致栈空间不够而崩溃。一般的递归都可以使用循环代替。3.2 不要使用using namespace 等级&#xff1a; 【必须】说明&#xff1a;这是曾经教科书上的一种写法&a…

“一百万行Python代码对任何人都足够了”

作者 | Jake Edge译者 | Kolen出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;编程语言通常对其操作过程的各个方面都有或明或暗的限制。诸如标识符的最大长度或变量可以存储的值的范围之类的事情&#xff0c;这些是相当明显的例子&#xff0c;但是还有其他一些例子…

网吧电影客户端Realplayer的装配问题

网吧电影客户端Realplayer的装配问题 作者: 出处:网吧联盟 ( 20 ) 砖 ( 22 ) 好 评论 ( 1 ) 条 进入论坛 更新时间&#xff1a;2005-11-24 16:54关 键 词&#xff1a;网吧阅读提示&#xff1a;一般有过开网吧经验的朋友&#xff0c;应当知道如何让自己的realplayer播放器支…

基于Servlet+JDBC+Bootstrap+MySQL+AJAX权限管理系统项目实战教程

项目简介 权限系统一直以来是我们应用系统不可缺少的一个部分&#xff0c;若每个应用系统都重新对系统的权限进行设计&#xff0c;以满足不同系统用户的需求&#xff0c;将会浪费我们不少宝贵时间&#xff0c;所以花时间来设计一个相对通用的权限系统是很有意义的。 本系…