簡體   English   中英

如何打開Windows資源管理器並從桌面應用程序搜索?

[英]How to open Windows explorer and search from a desktop application?

我正在使用c#/。net開發Windows桌面應用程序,並希望添加一項功能以打開Windows資源管理器並從該應用程序在計算機中搜索查詢。

我計划使用Windows搜索協議來實現它。 以下是我的代碼段。 rawQuery從我的應用程序傳遞到Windows資源管理器搜索框。

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())后,在Windows資源管理器搜索框中將其顯示不正確。 例如,如果rawQuery是中文,例如“微軟”,它將在Windows資源管理器中搜索“微轔。 這不好。

但是,如果未對rawQuery進行編碼,則Windows資源管理器搜索框中將不會顯示特殊字符,例如&,%等。

所以我不確定如何確定字符是否應該編碼。 我沒有在搜索協議規范中找到有關該文檔的任何文檔。

有人知道應該對哪些字符進行編碼嗎?

似乎確實沒有關於在搜索查詢中應使用url編碼的文檔,但是我們可以做出有根據的猜測。

首先, HttpUtility.UrlEncode如何編碼Unicode字符? 根據RFC 3986,此類字符應首先表示為UTF-8字節,然后應對這些字節進行pecent編碼。 那就是HttpUtility.UrlEncode所做的。 對於您的字符串:

var encoded = HttpUtility.UrlEncode(rawQuery); // = %e5%be%ae%e8%bd%af

2個字符用6個字節表示,每個3個字節。 解碼為微软 -6個字符。 因此很明顯,搜索查詢解碼器不希望使用UTF-8字符編碼。 它期望哪種編碼? 您可以通過少量實驗找到它-它是ISO-8859-1編碼。 您可以使用以下代碼驗證您的特殊情況:

var rawQuery = "微軟";
var encoded = HttpUtility.UrlEncode(rawQuery);
var iso = Encoding.GetEncoding("iso-8859-1");
var decoded = HttpUtility.UrlDecode(encoded, iso); // outputs "微软"

因此,我們可以得出結論,對ISO-8859-1以外的任何內容進行編碼是沒有意義的,並且將產生無效的結果,因為這些字符無法用這種編碼表示(僅為8位)。

該集中應編碼什么? 高於ASCII的任何內容(因此,字符128-256)都可以不進行編碼而傳遞。 這當然違反了RFC,但是我們已經知道搜索協議無論如何都不會遵循它,因為它允許UTF-8字符而無需編碼。 如果您想完全出於安全考慮,可以將¢(ISO-8859-1中為162)之類的字符編碼為%A2,它可以工作,但也可以不工作。

現在,我們需要對ASCII字符進行編碼,這些ASCII字符保留用於url的不同部分以供特殊​​使用,或者根本不允許在其中使用(未轉義),或被視為“使用未轉義時可能會引起問題”。 RFC表示此類字符為:

control     = <US-ASCII coded characters 00-1F and 7F hexadecimal>
space       = <US-ASCII coded character 20 hexadecimal>
delims      = "<" | ">" | "#" | "%" | <">
unwise      = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","

現在,並不是所有這些字符都需要在這種特殊情況下進行編碼,並且大多數字符都可以不進行編碼,但是如果您出於安全考慮也可以再次使用-您可以對所有字符進行編碼,或者通過嘗試找出它們錯誤(類似“&”,“%”,“ /”之類的字符顯然必須進行編碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM