想要唤起本地已安装应用程序,我想到的有三种可行的方法:

  第一种就是打开本地的快捷方式(有的应用可能没有快捷方式,但这种方法效率最高,可配合其他方法使用),快捷方式分为本地桌面快捷方式和开始菜单中的快捷方式两种。

  下面讲找出快捷方式路径的方法:

    本地桌面快捷方式:用户可能更改过默认的桌面路径,此时以前添加的快捷方式还在默认的c盘下路径,之后创建的快捷方式则会在新的桌面路径之下。

             因此我们首先获取到当前桌面的目录地址,代码如下:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);   //在path后面拼上 应用的名字.lnk 就是快捷方式的路径啦

               如果未更改过桌面目录,默认的c盘路径如下:

"C:\Users\Public\Desktop\" + appName + ".lnk"

    开始菜单的快捷方式:(默认主要有两种,在后面拼上应用的名字.lnk 就是快捷方式的路径啦)

C:\ProgramData\Microsoft\Windows\Start Menu\Programs
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

  然后把打开对应路径下的文件就可以实现打开本地快捷方式啦。

  打开的方法主要有三种:(详情可查看此篇文章https://www.cnblogs.com/y-yp/p/8782641.html),我只是用了下面这种,原因是比较简单:

System.Diagnostics.Process.Start(@"C:\Users\Public\Desktop\" + appName + ".lnk");

  此方法打开失败会返回异常,因此要用try{}catch{}语句把上面四种可能的快捷方式遍历一遍,并使其忽略返回的异常信息。

  当然这种方法显然不是特别的完美,可在遍历完之后,未找到应用的情况下再去注册表中查找应用程序的可执行(.exe)文件的路径,也就是第二种方法。

  第二种就是查找注册表,找出应用程序的安装路径,然后运行其中的.exe文件,如下:

    由于win10和win7注册表结构有些不同,我们首先需要判断系统的版本,然后执行不同版本的代码即可:

 Version currentVersion = Environment.OSVersion.Version;
Version compareToVersion = new Version("6.2");
if (currentVersion.CompareTo(compareToVersion) >= )
{
//win8及其以上版本的系统
}else{
// win7及其以下版本的系统
}

    win10主要在HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store下,里面直接存放的就是.exe文件的路径,代码如下:

 //win8及其以上版本的系统
using (RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"))
{
if (key != null)
{
bool isFind = false;
string[] sname = key.GetValueNames();
for (int i = ; i < sname.Length; i++)
{
if (sname[i].ToString().Substring(, ) == "C:" || sname[i].ToString().Substring(, ) == "D:" || sname[i].ToString().Substring(, ) == "E:" || sname[i].ToString().Substring(, ) == "F:" || sname[i].ToString().Substring(, ) == "G:" || sname[i].ToString().Substring(, ) == "H:") //查到的注册表可能有SIGN.MEDIA=2CE47846 VS2010\setup.exe,E:\win10\Opera\launcher.exe,需要判断
{
int ss = sname[i].ToString().LastIndexOf("\\");
string s = sname[i].ToString().Substring(ss, sname[i].Length - ss);
string sss = s.Substring(, s.Length - );
if (sss == appName.Text.Trim() + ".exe")
{
MessageBox.Show(sname[i].ToString());
try
{
System.Diagnostics.Process.Start(@sname[i].ToString());
isFind = true;
break;
}
catch {
continue;
}
}
}
}
if(!isFind){
MessageBox.Show("未找到应用,换个名字试试吧!");
}
}
}
}

    win7主要有三个目录,里面存放的是有应用相关命名的文件夹,内部有个 InstallLocation 字符串,其值是文件的安装路径,需再拼上  .exe文件名 + “.exe”(特例:QQ需要先进入Bin目录下):

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall     此为64位应用的路径。

    注意:此处需要将winform窗体改为64位应用,否则打开上述路径会被微软重定向到下面32位的目录。操作如下:

      右键项目-->属性-->生成,勾选掉首选32位。  

      

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall     此为32位应用的路径

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

    代码如下,把三个路径都加以实现即可:

 using (RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", false))
{
if (key != null)
{
//foreach (string keyName in key.GetSubKeyNames())
string[] SubK = key.GetSubKeyNames();
MessageBox.Show("length:" + SubK.Length);
for (int i = ; i < SubK.Length; i++)
{
//MessageBox.Show(SubK[i]);
using (RegistryKey key2 = key.OpenSubKey(appName.Text.Trim(), false))
{
if (key2 != null)
{
string installLocation = key2.GetValue("InstallLocation", "").ToString();
if (!string.IsNullOrEmpty(installLocation))
{
MessageBox.Show("路径:" + installLocation);
try
{
System.Diagnostics.Process.Start(@installLocation + "\\" + win7_txt.Text.Trim());
isFind2 = true;
break;
}
catch
{
MessageBox.Show("别循环!");
}
}
}
}
}
if (!isFind2)
{
MessageBox.Show("未找到应用,换个名字试试吧!");
}
}
}

    第三种方法就是使用user32.dll提供的API:FindWindowA和ShowWindow,这种方法很简单,但是这个方法只能打开已经在后台运行的应用(如果有更好的API请大佬下方留言)。

    首先在CLASS在声明API与常量: 

 [DllImport("user32.dll", EntryPoint = "FindWindowA")]
private extern static IntPtr FindWindowA(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
public const int SW_SHOWMAXIMIZED = ;
public const int SW_SHOWNORMAL = ;

    然后调用即可:

 IntPtr hwnd = FindWindowA("WechatMainWndForPC", null);
if (hwnd != IntPtr.Zero)
{
MessageBox.Show("找到窗口");
ShowWindow(hwnd, );
}
else
{
MessageBox.Show("没有找到窗口");
}

    其中FindWindowA需要两个参数(目标窗口类名,目标窗口标题),返回一个窗口的句柄(整数型),其中本地已打开窗口的标题(通用,一次获取后面即可通过findWindowA调用,类名获取未找到方法,还请大佬可以指导一下)可用py脚本获取:

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
from win32gui import *
titles = set()
def foo(hwnd,mouse):
#去掉下面这句就所有都输出了,但是我不需要那么多
if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd):
titles.add(GetWindowText(hwnd))
EnumWindows(foo, 0)
lt = [t for t in titles if t]
lt.sort()
for t in lt:
print(t)

   然后ShowWindow中传入FindWindowA得到的句柄和窗口的显示命令两个参数即可。

   ShowWindow第二个参数:

    SW_HIDE 隐藏窗口,活动状态给令一个窗口 
    SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
    SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
    SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
    SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
    SW_SHOWMINIMIZED 最小化窗口,并将其激活 
    SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
    SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
    SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
    SW_SHOWNORMAL 与SW_RESTORE相同

关于C# winform唤起本地已安装应用程序(测试win10,win7可用)的更多相关文章

  1. 升级本地已安装的 Node 和 npm 版本

    Mac升级本地已经安装的NodeJs和Npm到最新版,可以使用一下方式进行升级和更新. 其实windos上升级nodejs也很简单,只需在nodejs官网下载安装最新的msi即可. 值得注意的是安装时 ...

  2. hbase本地模式-安装及基本测试

    解压缩hbase二进制安装文件到/opt目录下: #tar -zxvf hbase-0.98.6-cdh5.3.6.tar.gz -C /opt/cdh-5.3.6/ 编辑配置文件,这里仅配置数据目录 ...

  3. VB.Net遍历已安装的程序卸载信息

    Private Shared Function ProgramExists(ByVal pgName As String) As Boolean Dim temp As String = Nothin ...

  4. 关于 Visual Studio 2017 ,或2019 ,Installer 没检测到已安装的程序.以及C++ 创建项目失败

    解决方法: 首先, 把 本机 的Installer.exe 卸载了. 2 , 重新下载 Installer.exe 打开后发现 ,又重新检测到 VS 2019 ,或2017了

  5. 技能Get·将浏览器已安装程序打包

    阅文时长 | 0.51分钟 字数统计 | 820字符 主要内容 | 1.前言&环境说明&预备知识 2.详细步骤 3.声明与参考资料 『技能Get·将浏览器已安装程序打包』 编写人 | ...

  6. 构建一个Gods Eye Android应用程序:第1部分 – 收集已安装的Android应用程序

    首先问候一下我的黑客伙伴们,在之前的Introduction to Amunet 教程中,我们了解到Amunet可能是一个间谍Android应用程序. 我不浪费太多时间因而直入主题. 在本教程中,我们 ...

  7. 列出 Ubuntu 和 Debian 上已安装的软件包

    列出 Ubuntu 和 Debian 上已安装的软件包 如果你经常用 apt 命令,你可能觉得会有个命令像 apt 一样可以列出已安装的软件包.不算全错. apt-get 命令 没有类似列出已安装软件 ...

  8. 谷歌浏览器(chrome)查找、打包已安装的扩展程序

    我们有时候会安装浏览器扩展程序,正常情况下,我们回去谷歌应用商店里面进行下载,但是这个需要VPN,有时候我们没法使用VPN,想从其他已安装扩展程序的浏览器上直接安装就可以使用我们下面这个方法 win1 ...

  9. 安装pytorch成功但cuda不可用

    贴上我看的教程https://zhuanlan.zhihu.com/p/26871672 一开始想用pycharm装pytorch,但不知道为什么一直失败.后来只能conda pip安装 但conda ...

随机推荐

  1. Jmeter系列(32)- 详解 CSV 数据文件设置

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 了解一哈什么是 CSV 文件 为了实现 ...

  2. liunx中组合查询的命令

    今天无聊,把以前的liunx命令拿过练练,尤其是一些组合命令并带有逻辑的.这里的script是一个文件夹. 1.查看一个文件的最后3行的第一行. [root@localhost home]# tail ...

  3. Spring Bean各阶段生命周期的介绍

    一.xml方式配置bean 二.Aware接口 2.1 BeanNameAware 2.2 BeanFactoryAware 2.3 ApplicationContextAware 2.4 Aware ...

  4. 【Model Log】模型评估指标可视化,自动画Loss、Accuracy曲线图工具,无需人工参与!

    1. Model Log 介绍 Model Log 是一款基于 Python3 的轻量级机器学习(Machine Learning).深度学习(Deep Learning)模型训练评估指标可视化工具, ...

  5. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  6. Spring 获取单例流程(一)

    读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...

  7. requirejs之demo

    具体的理论就不讲了,可以参考 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html http://www.ruanyifeng.c ...

  8. JVM零碎知识

    JVM常见XX参数 查看JVM默认值 常用基本配置参数 生产环境服务器变慢,如何诊断 生产环境CPU占用过高,如何诊断 JDK自带的JVM监控和性能分析工具 jps(虚拟机进程状况工具) jinfo( ...

  9. json转化为C#、Java、TypeScript、VisualBasic、Python实体类

    效果展示: 源码下载地址:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample2

  10. day40 作业

    利用线程和进程实现tcp 服务端 from multiprocessing import Process from threading import Thread import socket def ...