在昨天的博客里,我给大家了一种通过修改程序的app.manifest文件来获得UAC授权的方法。
也不知道大家有没有在平时使用电脑的过程中留神注意到这样的细节:有一小部分的程序启动时并不会主动申请UAC授权,但在程序内部,会有一些按钮上显示UAC的小盾牌,点击这样的按钮之后才会弹出UAC授权的界面,比如说笔者现在在用的Alcohol 120%软件,就有这样的神奇的按钮:
这到底是怎么做到的呢?
其实也很简单,甚至在管理员关闭UAC功能的情况下,我们都可以在自己的程序界面按钮上添加这个盾牌标志。
首先打开Visual Studio,新建一个项目,在一个窗口上拖一个Button控件。
然后双击这个Button控件,在这个控件里输入代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private void button1_Click(object sender, EventArgs e) { ProcessStartInfo psi = new ProcessStartInfo(); psi.UseShellExecute = true; psi.Verb = "runas"; psi.FileName = Application.StartupPath + "\\isAdministrator.exe"; try { Process.Start(psi); } catch (Exception ex) { MessageBox.Show("启动程序时失败!\r\n失败原因:" + ex.Message, this.Text, MessageBoxButtons.OK,MessageBoxIcon.Exclamation); } } |
输入完上面的代码,按F5执行之,程序启动之后我们发现按钮并没有什么变化,但是单击这个按钮就会弹出UAC授权界面。
很成功的出现UAC授权了是不是233……等等别打别打……
我知道你们刚刚一定非常愤怒想打我,不是说按钮上有个UAC盾牌标记点了再出现UAC授权界面的吗,怎么刚刚这个程序就只有UAC授权界面,按钮上的UAC图标哪去了?
关于这个问题,回答很简单,因为这两者之间没有任何关系。
刚刚的代码中,我们在启动指定应用程序的时候加了这么一句话:
1 |
psi.Verb = "runas"; |
这句话的作用就是让.net框架在启动目标程序的时候自动向用户申请UAC权限。而程序界面上按钮的UAC盾牌图标只是起到了一个提示性的作用,告诉用户:当您点击这个按钮的时候,我会向你申请UAC权限,希望您做好准备。
所以说:
程序界面按钮上的UAC盾牌图标其实是程序员人为的添加上去的!
添加这个图标其实很随意,甚至在当前计算机UAC功能关闭的情况下也能网上添加,只要跑几行代码就可以了。
首先要声明两个常量和一个API函数——SendMessage()
1 2 3 4 5 |
[DllImport("user32")] private static extern UInt32 SendMessage(IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam); private const int BCM_FIRST = 0x1600; private const int BCM_SETSHIELD = (BCM_FIRST + 0x000C); |
然后是添加和删除UAC盾牌标志的代码:
1.给目标按钮添加上UAC盾牌标志:
1 2 3 4 5 |
private void AddShieldToButton(Button btn) { btn.FlatStyle = FlatStyle.System; SendMessage(btn.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF); } |
2.给目标按钮去除掉UAC盾牌标志:
1 2 3 4 5 |
private void DeleteShieldFromButton(Button btn) { btn.FlatStyle = FlatStyle.System; SendMessage(btn.Handle, BCM_SETSHIELD, 0, 0x0); } |
好了,接下来只要在特定时间去调用上面的方法就行了!
当你需要给按钮button1添加UAC标志时,只需要这么一句命令:
1 |
AddShieldToButton(button1); |
当又不需要这个UAC标志的时候,也只要一句命令:
1 |
DeleteShieldFromButton(button1); |
不过对于一些重度强迫症患者用户来说,关闭UAC功能就是为了不想看到那个UAC标志,所以在给按钮添加UAC标志之前,可以用昨天给大家的IsAdministrator()函数来判断一下程序当前是否拥有管理员权限。例如:
1 2 3 4 5 6 7 8 |
private void frmMain_Load(object sender, EventArgs e) { if (!IsAdministrator()) { //没有管理员权限,给按钮添加盾牌图标 AddShieldToButton(button1); } } |
追根揭底,程序中按钮上的UAC图标就是这么一回事儿……
嗯……嘛,也就这样吧╮( ̄▽ ̄")╭
小柊
2015年9月28日 20:58:59