Windows 7 Gadgets - язык программирования для разработки - PullRequest
2 голосов
/ 09 ноября 2009

Какой предпочитаемый язык разработки для гаджетов Windows 7?

Я знаю, что гаджет использует Xml, Html, CSS и Script (Java / VB), но мне нужны некоторые дополнительные функции, такие как:

  1. Запись / чтение файла
  2. Получение списка запущенных процессов
  3. Отправка ключей в активное приложение

Для выполнения вышеуказанных задач мне потребуется использовать Windows API или, если возможно, .NET. Возможно ли использовать в гаджете перечисленные функции?

1 Ответ

4 голосов
/ 01 декабря 2009

Существуют различные COM-объекты, доступные для JScript с использованием класса ActiveXObject. Вы можете написать свою собственную сборку взаимодействия, используя .NET, но это создает несколько проблем:

  • Каждый открытый класс в сборке должен быть зарегистрирован на хост-машине перед использованием. Существуют проблемы, возникающие при записи и создании ключей в x64, с которыми объект WScript.Shell борется за определенные части реестра. Однако WMI хорошо работает для регистрации.
  • Из экземпляра dll сборки заблокирована и не может быть удалена, даже если гаджет закрыт. Это главным образом проблема, когда деинсталляция / обновления программного обеспечения вступают в игру. После завершения процесса sidebar.exe файл становится разблокированным.
  • Отмена регистрации кажется проблематичной, даже с WMI. Сроки отмены регистрации часто являются проблемой (вы делаете это при выгрузке или после создания экземпляра? Что, если с его помощью открыто несколько гаджетов?). Кроме того, не отмена регистрации оставит ненужные ключи реестра на компьютере пользователя, если он / она решит не сохранять ваш гаджет.
  • Если гаджет на 100% полагается на сборку и по какой-либо причине сборка не может быть зарегистрирована на компьютере пользователя, то весь доступ к гаджету для этого пользователя недоступен. Будьте готовы к некоторым низким оценкам в Windows Live Gallery.

Если вы решили, что вам действительно нужно написать сборку. Я бы посоветовал вам, если вы пишете свою собственную сборку для гаджета, это расширение базовой функциональности вашего гаджета и вы гарантируете, что гаджет имеет доступные функции, если пользователь не сможет использовать сборку.

У моей компании пока еще не выпущено решение вышеуказанных проблем, которое мы планируем сделать доступным для всех разработчиков гаджетов Windows для настольных ПК в ближайшем будущем (т. Е. После дополнительного тестирования).

Что касается указанных вами расширенных функций, то все они могут быть выполнены с использованием некоторых встроенных COM-объектов Windows, которые уже зарегистрированы и не распространяются вместе с вашим гаджетом, поэтому они не страдают от тех же проблем, что указаны выше. В качестве ответа на ваши конкретные требования, примеры этого:

FileSystemObject
Запись / чтение файлов может быть сделано с помощью FileSystemObject . Базовый пример FileSystemObject для чтения файлов:

var ForReading = 1, ForWriting = 2, ForAppending = 8;
var oFSO  = new ActiveXObject("Scripting.FileSystemObject");
var oFile = oFSO.OpenTextFile(System.Gadget.path+"\\test.txt", ForReading, true);
var sText = oFile.ReadAll();
window.prompt("", sText);

Инструментарий управления Windows (WMI)
WMI имеет огромный диапазон целей. Однако для некоторых его частей требуются права администратора (которые должны применяться к sidebar.exe). Одним из классов в WMI является Win32_Process , который можно использовать для итерации по запущенным процессам. Обратите внимание, что гораздо труднее использовать WMI в JScript, чем в VBScript, и большинство примеров, которые вы можете найти в Интернете, относятся к VBScript (что делает перенос кода болезненным).

Windows Script Host Shell WshShell Object предоставляет еще одно замечательное расширение ограничений гаджетов рабочего стола Windows, включая метод SendKeys . Хотя этот метод нельзя использовать для конкретной отправки ключа в приложение, его можно активировать с помощью метода AppActivate , а затем использовать SendKeys для эмуляции нажатия клавиш в активированном приложении.

Надеюсь, это поможет: -)

...