• C# Process.Start()函数打开url被360拦截问题


    使用Process.Start(new ProcessStartInfo(url))来打开某一网址的时候,往往会被360提示 类似这样的 信息:

    “威胁:修改此注册表项将更改IE连接设置。少数软件会修改此项,如果随意修改,可能造成无法上网。如果您不认识此程序,请阻止。”

    这是由于 360 会判断启动浏览器的父窗口,如果父窗口是系统或受信程序则通过,反之,若是未知的程序 则 提示威胁。

    了解了这个,我们就可以想到 用 api函数 ShellExecute,通过指定 父窗口参数为 null(0)来避免360提示。如下:

            [DllImport("shell32.dll")]
            public extern static IntPtr ShellExecute(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
            public enum ShowWindowCommands : int
            {
                SW_HIDE = 0,
                SW_SHOWNORMAL = 1,
                SW_NORMAL = 1,
                SW_SHOWMINIMIZED = 2,
                SW_SHOWMAXIMIZED = 3,
                SW_MAXIMIZE = 3,
                SW_SHOWNOACTIVATE = 4,
                SW_SHOW = 5,
                SW_MINIMIZE = 6,
                SW_SHOWMINNOACTIVE = 7,
                SW_SHOWNA = 8,
                SW_RESTORE = 9,
                SW_SHOWDEFAULT = 10,
                SW_MAX = 10
            }
            ShellExecute(0, @"open",@"http://www.baidu.com", null, null, (int)ShowWindowCommands.SW_NORMAL);

    附上 ShellExecute的 一些参考信息:
    1.函数功能:
    你可以给它任何文件的名字,它都能识别出来并打开它。
    2.函数原型:
    HINSTANCE ShellExecute(
                               HWND hwnd,
                               LPCTSTR lpOperation,
                               LPCTSTR lpFile,
                               LPCTSTR lpParameters,
                               LPCTSTR lpDirectory,
                               INT nShowCmd
    );  
    3.参数说明:
    hwnd:
    用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。
    lpOperation:
    用于指定要进行的操作。
    “open”操作表示执行由lpFile参数指定的程序,或打开由lpFile参数指定的文件或文件夹;
    “print”操作表示打印由lpFile参数指定的文件;
    “explore”操作表示浏览由lpFile参数指定的文件夹。
    当参数设为NULL时,表示执行默认操作“open”。  
    lpFile:
    用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
    lpParameters:
    若lpFile参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为NULL.
    lpDirectory:
    用于指定默认目录.
    nShowCmd:
    若lpFile参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
    这个参数常用的常数:
    SW_HIDE 隐藏窗口,活动状态给令一个窗口
    SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
    SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
    SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
    SW_SHOWMAXIMIZED 最大化窗口,并将其激活
    SW_SHOWMINIMIZED 最小化窗口,并将其激活
    SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
    SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
    SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
    SW_SHOWNORMAL 与SW_RESTORE相同
    若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。  

    4.返回值

    执行成功会返回应用程序句柄

    返回的HINSTANCE可以将它转换为一个整数(%d),并比较它的值大于还是小于32或比较它的错误代码
    返回值大于32表示执行成功
    返回值小于32表示执行错误

    msdn:If the function succeeds, it returns a value greater than 32. If the function fails, it returns an error value that indicates the cause of the failure. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. It can be cast only to an int and compared to either 32 or the following error codes below.

    返回值可能的错误有: = 0 {内存不足}

    ERROR_FILE_NOT_FOUND = 2; {文件名错误}

    ERROR_PATH_NOT_FOUND = 3; {路径名错误}

    ERROR_BAD_FORMAT = 11; {EXE 文件无效}

    SE_ERR_SHARE = 26; {发生共享错误}

    SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}

    SE_ERR_DDETIMEOUT = 28; {超时}

    SE_ERR_DDEFAIL = 29; {DDE 事务失败}

    SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务}

    SE_ERR_NOASSOC = 31; {没有相关联的应用程序}

    5.使用方法:
    例如:
        ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);      
    用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
        这个函数能打开任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute 返回打开文件的应用的实例句柄。
    ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL); 
        这个代码使你能访问微软的主页。当ShellExecute遇到文件名前面的“http:”时,可以判断出要打开的文件是Web文件,随之启动Internet Explorer 或者 Netscape Navigator 或者任何你使用的别的浏览器打开文件。
    ShellExecute还能识别其它协议,象FTP、GOPHER。甚至识别“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它启动电子邮件程序并打开一个待编辑的新邮件,例如:
        ShellExecute(NULL, "open",“mailto:zxn@hq.cninfo.net”, NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。
        总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,或者任何你使用的别的浏览器打开文件。


    ------------------------------------------------------------------------------------ 
    原文:https://blog.csdn.net/snakorse/article/details/20035437

  • 相关阅读:
    Markdown学习
    二叉树的最近公共祖先
    javaCompiler简析
    自定义类加载器
    聚合和组合的区别
    拓扑排序
    C++ map和unordered_map
    静态文件加载路径
    文件上传
    jackson
  • 原文地址:https://www.cnblogs.com/Shaina/p/11064569.html
Copyright © 2020-2023  润新知