none
如何从我开发的桌面应用程序中调用windows的API打开windows explorer并搜索?

    问题

  • 我在用c#开发一个Windows桌面应用程序,其中想实现这样一个功能,有一个搜索框,用户可以打任意字符然后搜索,期望的行为是windows explorer打开,应用程序搜索框中的字符显示在windows explorer的搜索框中。

    我是用Windows 的search protocol实现的,下面是我的代码片段,其中rawQuery是应用程序搜索框中的字符:

                    var query = "&query=" + HttpUtility.UrlEncode(rawQuery);
                    var location = string.Empty;
                    foreach (var drive in DriveInfo.GetDrives().Where(d => d.IsReady && d.DriveType.Equals(DriveType.Fixed)))
                    {
                        location += "&crumb=location:" + HttpUtility.UrlEncode(drive.Name);
                    }
                    var searchQuery = "search:displayname=Search computer" + query + location;
                    Process.Start(searchQuery);

    我碰到的问题是我没有查到任何文档说明rawQuery中的什么字符需要调用HttpUtility.UrlEncode()编码,什么字符不需要编码。我试下来的结果是,

    1. 特殊字符(&、%、*等)需要编码。如果不编码,&、%、*等不会显示在Windows explorer的搜索框中。

    2. 非英文(中文、法文等)不能编码。如果编码,windows explorer的搜索框中会出现乱码。比如,“微软”会显示成微软

    但是以上只是我试验出来的结果。请问,有文档说明什么字符必须编码后才能传给windows 的search protocol吗?

    谢谢!

    2017年4月9日 9:24

全部回复

  • Hi zhhzhang,

    感谢你在MSDN论坛发帖。

    这个问题应该是你工程采用的编码方式不对。

    对于英文字符采用的是ASCII码编码,它是用一个字节来表示一个符号(字母26符号,还有其他),它最多能表示多少个呢? 2^7是128个字符,如果这些& %字符没有存在ASCII编码表中,是不会显示出来的。 这个要检查一下你的ASCII编码表。

    >>汉字显示出不来的原因。

    因为汉字的编码采用的2个字节,对于中文,我们采用的是GB2312编码,如果你采用ASCII编码来显示汉字,结果就是乱码,因为表不一样。

    对于你的几种问题,我建议你使用 Unicode 编码方式,因为 Unicode 编码就是为了统一各个国家的文字,而诞生的。每个国家的编码都可以使用 Unicode 编码表正确的显示出来。

    Unicode 编码采用的是3字节,来表示,它能代表的字符就会更多。

    使用的Unicode 编码的时候,我建议使用utf-8 编码,它是变长的。

    你可以在百度中搜索,utf-8 变长,就知道变长是什么意思了。

    同样utf-16 大端和小端,也可以。因为utf-8 ,utf-16 大小端,都是 Unicode 编码的实现。

    Best Regards,

    Hart

    如果你的问题解决了,请及时标记有用的回复作为答案,这样会帮助遇到相同问题的人。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月10日 2:08
    版主
  • Hi Hart,

    感谢你的回复!

    我尝试对rawQuery作了UTF8编码和Unicode编码,

    HttpUtility.UrlEncode(rawQuery, Encoding.UTF8)

    输入          显示在windows explorer搜索框中的字符

    微软      -> 微软

    &          -> &

    microsoft -> microsft 

    HttpUtility.UrlEncode(rawQuery, Encoding.Unicode)

    输入          显示在windows explorer搜索框中的字符

    微软        -> ®_o

    &            -> &26%00

    microsoft -> m%00i%00c%00r%00o%00s%00o%00f%00t%00

    我不知道有没有理解错你的方法,看起来UTF-8编码对中文还是不行。



    • 已编辑 zhhzhang 2017年4月10日 5:29
    2017年4月10日 5:26
  • Hi,

    首先你要确定你整个程序编码方式, 是不是 UTF-8编码? 

    如果整个程序都是ascii编码,只有这个是UTF-8,也是不行的。

    我刚才建立一个Windows form的程序,整个程序默认的编码方式是UTF-8,所以能显示中午。

    还有一点,对于exe文件,我们也是需要选择编码方式的,如果你使用GCC工具,可以尝试使用

    下面这个指令 man gcc, /charset, 就看可以看到相关的选项,在程序编译好了以后,我们也许需要指定编码方式,gcc的编译器,默认的输出exe编码方式是UTF-8。

    如果是微软的编译器,默认输出也是UTF-8,请确认这一点

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    2017年4月10日 5:52
    版主
  • Hi,

    我是用.NET Framework 4.5.2新建的WPF程序,rawQuery是TextBox的Text, 我想程序应该是UTF-8编码。

    2017年4月10日 6:02
  • Hi,

    刚刚测试一下这个代码,在WPF中。

    string a=  HttpUtility.UrlEncode(textBox.Text, Encoding.UTF8);
     MessageBox.Show(a); 

    没有出现乱码的现象,下面是两个测试截图

    %e5%be 这个是正常的形式对于微软 两个字

    是不是你的代码,哪个地方出现问题了。 

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月10日 6:28
    版主
  • Hi Hart,

    我试了一下,我的代码在MessageBox里面显示确实也没有问题,但是在windows explorer的搜索框里面显示却是乱码。

    我好像没有发布图片的权限,不知道我是否表达清楚了我的意思。

    如果你把string a像我的代码一样传给search protocol,不知道你的程序是否能在windows explorer的搜索框中正确显示a?

    


    • 已编辑 zhhzhang 2017年4月10日 6:56
    2017年4月10日 6:48
  • Hi,

    你的账号是刚注册,等你为论坛做贡献以后,就会有上传图片的权利了。

    >>" 但是在windows explorer的搜索框里面显示却是乱码。 "

    我觉得这个显示乱码应该是windows explorer里面出现错误。我这边没有完整的程序(不包括search protocol)。

    你可以上传一个可以重现问题的demo到onedrive 上面吗?

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月10日 7:12
    版主
  • Hi Hart,

    我上传了可以重现问题的WPF project到onedrive,https://1drv.ms/f/s!ApcPPHowX31ShRr-fN0DHK0CEAtH

    2017年4月10日 8:36
  • Hi zhhzhang,

    根据代码的我进行了测试。

    如果我直接写死"微软",它是可以正常显示出来的。

      var query1 = "微软";
      var searchQuery = "search:displayname=" + query1 + location; ///微软 query

    这说明是可以search explorer 是可以显示出汉字。

    为什么你要把源码转成HTTP的形式,进行搜索呢。你转成HTTP以后,我觉得应该再转回来。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月11日 8:30
    版主
  • Hi Hart,

    我调用HttpUtility.UrlEncode()是要保证&、%等特殊符号能够在windows explorer的搜索框中能够正确显示。否则&、%等特殊符号是不能正确显示的。

    正如你所说的,汉字不应该编码。但是我的问题是,什么样的字符应该编码,而什么样的字符不应该编码呢?微软有一个这样的官方文档吗?

    谢谢!

    2017年4月11日 9:09
  • Hi,

    根据我的查找,我没有搜到相关信息关于什么字符可以编码,什么字符不可以编码。


    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月12日 9:36
    版主