软件要这样嫁给Win7
技术与开发
魏伟,微软MVP(微软最有价值专家),产品设计&系统架构师,研发的产品主要有电话会议服务、移动代理服务器、无线开发中间件等。
是不是看到Win7的酷炫功能流口水,已经忍不住想拥抱呢?别急,Win7的脾气可不好,要想拥抱它的新功能,我们的软件必须嫁给它——在Win7下能正常运行。个人开发者开发的中小软件,功能相对简单,与系统的紧密程度普遍较低,添加一些Win7必要的正常运行的元素就OK啦!
嫁给Win7的必要条件
我们必须要给软件添加的是系统版本检测和安装路径选择元素,为什么要考虑它们呢?
必要条件1:检测系统版本
软件在运行初期需要判断操作系统的类型及版本号,并根据操作系统类型执行特定的代码,相同的功能在不同操作系统上可能会执行不同的代码。大多数软件在Win7下无法正常运行都是因为判断操作系统版本失败造成的。
当版本检测出错时,很多软件也会跟着出错,用户可能会发现双击软件图片后什么反应都没有,或者看到一个对话框“你必须运行在Microsoft Windows XP或更新版本”,但实际上计算机已经安装了Win7 。
必要条件2:适应用户权限
Win7默认运行的是非管理员账号,权限相对较小,而软件的安装程序会往系统盘的Program Files、Windows安装目录、注册表中写入一些数据(软件在运行时可能会将一些用户数据保存到系统文件夹或注册表中),如果当前用户的权限不够,软件就无法正常入驻Win7。
小知识:UAC是一种降低Windows用户默认权限的办法,会给用户带来安全性的提高,它可以在一定程度上遏制一些病毒的发作——关闭杀毒软件、复制及散播病毒、注入网游客户端、监听键盘操作从而盗窃密码。
例如数据看似保存成功,在写入的地点却找不到,或者注销切换到另一个Windows用户时,无法找到保存的数据。引起这类问题的根源是Win7的UAC机制,它降低了Windows用户的默认权限,使得一些普通操作无法更改系统设置及系统保护的文件夹。
小提示:软件要结合系统某些功能时,需要调用相应的API。API调用是否得当,对软件运行非常关键,我们从下期开始结合Win7酷炫功能,单独介绍如何正确地调用。Win7最新的API,有Win7特有的任务栏个性化快捷菜单(Jump List)、程序图标轮廓效果(Icon Overlay)、程序图标进度条效果(Progress Bar)、标签式缩略图(Tabbed Thumbnail)和缩略图工具栏(Thumbnail Toolbar)……
“婚礼”必要的元素
我们的软件要顺利嫁给Win7,在软件中要添加以下元素。
1.代码检测操作系统版本号
在软件中添加判断操作系统是Win7 或2008 Server的代码:
C#
if (Environment.OSVersion.Version > new Version(5, 1))
{MessageBox.Show("Windows 7 or Windows 2008 Server","Operating System",
MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
2.尽量将数据存储在非系统盘
软件不要默认安装到系统盘,在编写软件安装路径时,要考虑这个。此外,还需要在软件中添加修改读写注册表的代码,使用HKEY_CURRENT_USER\Software下的键值作为存储数据的地方:
static void Main(string[] args)
{
var registryKey = Registry.CurrentUser.CreateSubKey(
@"Software\test");
registryKey.SetValue("name", "zswang");
registryKey = Registry.CurrentUser.OpenSubKey(@"Software\test");
Console.WriteLine(string.Format("{0}={1}\r\n",
"name", registryKey.GetValue("name")));
}
3.提高程序的运行权限
如果用户使用了管理员身份进入系统,又希望把软件安装在系统盘,又该如何办呢?需要判断用户权限的大小,简单的解决方案是添加清单文件。在可执行文件夹中新建一个与可执行文件相同名字且扩展名为.manifest的文件,输入以下代码即可:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="test"
type="win32"/>
<description>Description of your application</description>
<!—— Identify the application security requirements. ——>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
同时打开数个网页,可通过窗口分组预览,是不是特别酷?其实,除了Office、网页浏览器等大型软件,我们个人开发的中小软件也能做到。那需要怎么做呢?请看下期。
小编救急
pcw-chendx@vip.sina.com
在讲解手机编程时,小编建立了很多开发QQ群,有许多读者朋友在里面交流,其中谈论得较多的是开发过程中碰到的各种问题。为此,小编特意开辟了一个救急板块,无论你开发哪种程序,无论你碰到什么问题,我们都可以给你提供帮助。
关键词:窗口总在最前
读者来信:我希望编写的应用程序(用VB写的)在运行时不被其他程序的窗口遮住,怎样才能让程序窗口在运行时总在最前?
小编:要想使程序窗口在运行时总在最前,可在应用程序窗体的“通用模块”中声明下面的过程:
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_WNDPROC = -4
Const WM_RBUTTONUP = &H205
然后在窗体的“Activate”事件中输入下面的代码:
Private Sub Form_Activate()
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
关键词:彻底隐藏工作表
开发QQ群:因为工作关系,有时候要在Excel中将指定的工作表隐藏起来,我是通过系统菜单中的“隐藏”命令来做的,可通过“取消隐藏”就可以将隐藏的工作表显示出来。为了让“取消隐藏”失效,我在网上查找了半天,听说编程可以解决,特来请教。
小编:哈哈,你这个要求真的很特别——网上都是如何使用“取消隐藏”的文章,这个编程的确可以解决。在Excel中,调出VBA编辑器,输入以下代码Sheets("工作表名称").Visible = xlSheetVeryHidden (或"=2"或"False"),这样就将工作表彻底隐藏了。如果要取消隐藏,将代码改为Sheets("工作表名称").Visible = xlSheetVisible (或"= -1"或"True")即可。
关键词:欢迎界面
开发QQ群:我用WordPress搭了一个博客,现在有这么一个设想,就是给我的博客增加一个首页(独立于WordPress)——制作一个欢迎界面。当用户第一次访问的时候,看到的将是这个首页,如果以前访问过就跳过首页直接进入博客。这个功能怎么实现?我的空间是PHP的。希望能帮我解决这个问题,谢谢!
小编:要实现这样的功能,首先必须增加一个独立于博客的首页,然后在首页中利用Cookie识别用户是否第一次访问,如果是第一次访问则显示介绍内容,否则便立即转到博客主页。WordPress博客默认首页是index.php,所以首页名字保存为default.php。新建一个记事本,在里面输入相关代码,最后另存为default.php即可。
<? php
if (isset($myCookies)) { /*如果Cookie已经存在,表明并非第一次访问*/
$url=index.php; /*跳转地址,利用JavaScript代码跳转*/
echo "<!——<script language="javascript">";
echo "location.href='$url'";
echo "</script>——>";
} else {/*如果Cookie不存在,写入Cookie,显示介绍页面*/
SetCookie ("myCookies",shudoo, time()+94608000); /* 三年后Cookie 才会失效 */
}
>
<html xmlns="http://www.***.com">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>欢迎光临数动博客</title>
<link href="inc/index.css" rel="stylesheet" type="text/css" />
<script src="inc/jsitt.js" type="text/javascript" /></script>
</head>
<body>
<div id="content">自定义首页简介内容</div>/*介绍内容自己修改*/
<a href="index.php" >立即打开博客</a>/*给出博客地址*/
</body>
</html>
登录虚拟主机管理界面,将default.php设置在index.php文档前面,以便默认显示自定义的是首页而非博客页面。