如何在新增、移除或變更裝置時取得通知 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
這個教學課程說明如何動態列舉裝置。接著,您的應用程式就可以在新增或移除裝置,或是變更裝置屬性時收到通知。
您使用 DeviceWatcher 類別開始裝置列舉。對於找到的每個裝置,DeviceWatcher 會引發 Add 事件,直到找到所有裝置而且列舉完成為止。第一次列舉完成之後,DeviceWatcher 會在新增、更新或移除裝置時繼續引發事件。
您必須知道的事
技術
- Windows Runtime
先決條件
JavaScript 與 HTML。
指示
步驟 1: 開啟 Microsoft Visual Studio
開啟 Visual Studio 的執行個體。
步驟 2: 建立新專案
在 [新增專案] 對話方塊中,從 [JavaScript]**** > [Windows 市集應用程式] 專案類型選取空白的應用程式。
步驟 3: 插入應用程式 JavaScript 和 HTML
開啟您的 Default.html,然後複製下列的 HTML 到檔案中,取代原始內容。
<!DOCTYPE html>
<html>
<head>
<title>Device Enumeration Sample</title>
<meta charset="utf-8" />
<script src="/js/default.js"></script>
</head>
<body role="application">
<h1>Device Enumeration Sample</h1>
<h2 >Input</h2>
<div >
<div >
<p>This example incrementally enumerates devices, adding them to a list each time a device is found, and also watching for updates.
Once enumeration is complete, the list of devices is printed.</p>
<input type="button" value="Watch(All Devices)" onclick="WatchDevices()"/>
<br /><br />
<input type="button" value="Stop" onclick="stopWatcher()"/>
<br /><br />
</div>
</div>
<h2 > Output</h2>
<div id="statusMessage"></div>
<!-- Output -->
<div id="output"></div>
</body>
</html>
步驟 4:
將這個程式碼貼到 default.js 中,取代檔案的內容。
var watcher;
var isEnumerationComplete = false;
var deviceArray = new Array(); // Saves the enumeration results
function WatchDevices() {
try {
output.innerHTML = ""; // clear output field
watcher =
Windows.Devices.Enumeration.DeviceInformation.createWatcher();
// Add event handlers
watcher.addEventListener("added", onAdded);
watcher.addEventListener("removed", onRemoved);
watcher.addEventListener("updated", onUpdated);
watcher.addEventListener("enumerationcompleted",
onEnumerationCompleted);
watcher.addEventListener("stopped", onStopped);
// Start enumerating and listening for events
watcher.start();
} catch (e) {
document.getElementById("statusMessage").innerHTML =
"Failed to create watcher, error: " + e.message;
}
}
function stopWatcher() {
try {
watcher.stop();
}
catch (e) {
document.getElementById("statusMessage").innerHTML =
"Failed to stop watcher: " + e.message;
}
}
function onAdded(devinfo) {
document.getElementById("output").innerHTML += "<p>Device added: " +
devinfo.name + "</p>";
deviceArray.push(devinfo);
if (isEnumerationComplete) {
output.innerHTML = ""; // clear output field
printDeviceArray(document.getElementById("output"));
}
}
function onUpdated(devUpdate) {
document.getElementById("output").innerHTML += "<p>Device updated.</p>";
for (var i = 0; i < deviceArray.length; i++) {
if (deviceArray[i].id == devUpdate.id) {
deviceArray[i].update(devUpdate);
}
}
output.innerHTML = ""; // clear output field
printDeviceArray(document.getElementById("output"));
}
function onRemoved(devupdate) {
document.getElementById("output").innerHTML += "<p>Device removed.</p>";
for (var i = 0; i < deviceArray.length; i++) {
if (deviceArray[i].id == devupdate.id) {
deviceArray[i].slice(devupdate);
}
}
output.innerHTML = ""; // clear output field
printDeviceArray(document.getElementById("output"));
}
function onEnumerationCompleted(obj) {
isEnumerationComplete = true;
document.getElementById("output").innerHTML +=
"<p>Enumeration Completed.</p>";
printDeviceArray(document.getElementById("output"));
}
function onStopped(obj) {
document.getElementById("output").innerHTML += "<p>Stopped.</p>";
if (watcher.status == Windows.Devices.Enumeration.DeviceWatcherStatus.aborted) {
document.getElementById("output").innerHTML +=
"<p>Enumeration stopped unexpectedly. </p>";
document.getElementById("output").innerHTML +=
"<p>Click the Watch button to restart enumeration.</p>";
} else if (watcher.status == Windows.Devices.Enumeration.DeviceWatcherStatus.stopped) {
document.getElementById("output").innerHTML +=
"<p>You requested to stop enumeration. </p>";
document.getElementById("output").innerHTML +=
"<p>Click the Watch button to restart enumeration.</p>";
}
}
// Prints the friendly name of the device interface,
// its ID (device interface path), and whether it is enabled.
function printDevice(deviceInterface, outputDestination) {
outputDestination.innerHTML += "<p>Name: " +
deviceInterface.name + "<p/>";
outputDestination.innerHTML += "<p>Interface ID: " +
deviceInterface.id + "<p/>";
outputDestination.innerHTML += "<p>Enabled: " +
deviceInterface.isEnabled + "<p/>";
outputDestination.innerHTML += "<br />";
}
function printDeviceArray(outputDestination) {
for (var i = 0; i < deviceArray.length; i++) {
printDevice(deviceArray[i], outputDestination);
}
}
備註
這個範例會以累加方式列舉裝置。只要找到裝置就會將它加入清單,同時也會尋找更新。列舉完成後,應用程式就會列印裝置清單。如果使用者在第一次列舉完成後又新增、更新或移除裝置,應用程式也會列印訊息。
注意 應用程式必須訂閱所有 added、removed 及 updated 事件,才能在有裝置新增、移除或更新時收到通知。如果應用程式僅處理 added 事件,則在初次裝置列舉完成之後,若有裝置被新增到系統中,應用程式將不會收到更新。