Автоматическое подключение к дисплею MS Wireless в Windows 10
Я хочу написать службу Windows (в C#) или скрипт powershell, который автоматически подключает мой ноутбук (при загрузке или комбинации клавиш) к моему беспроводному адаптеру дисплея MS для зеркального отображения экрана. В Windows 10 я могу сделать это только вручную, перейдя в уведомления и нажав Подключиться> Беспроводной адаптер MS> Подключиться.
Я обнаружил, что существует Miracast API ( https://msdn.microsoft.com/en-us/library/windows/hardware/dn265515(v=vs.85).aspx), но документации о том, как использовать это.
Я также нашел этот http://filelog.net/file/MiraDisp.dll/2c279c8d57a47a9ca06aa279bd9e0e8e22c7c1c1 и есть две функции OpenMiracastSession и CloseMiracastSession.
Проблема в том, что я не знаю, как использовать эти функции в C#. Я знаю, что мне, вероятно, придется использовать pInvoke. Может кто-то указать мне верное направление?
6 ответов
Прежде всего, спасибо @CodingGorilla за предложение по AutoHotkey. Я играл с этим последние пару дней.
Я пошел по маршруту AutoHotkey, так как не мог найти легкого места для начала с любым Windows 10 API. Всякая документация для всплывающих уведомлений, но я не смог найти ничего, что могло бы управлять центром действий. Если у кого-то есть предложения по этому вопросу, пожалуйста, напишите их.
Вот то, что я придумал, используя AutoHotkey. Довольно простое, но не идеальное решение, так как есть несколько переменных с этим. Ниже приведен код сценария AutoHotkey, который я использовал для открытия центра действий, нажмите "Подключиться", а затем щелкните самый верхний из перечисленных беспроводных дисплеев:
Send #a ;Sends Windows button + A to open the action center
Sleep, 750 ; Give it some time to slide open
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, C:\Connect.png ;Try to find the Connect button tile
if ErrorLevel = 2
MsgBox Could not conduct the search for the connect button in action center. Make sure your search image is in the correct location.
else if ErrorLevel = 1
MsgBox Connect button cannot be found on the screen.
else
MoveMouseAndClick(FoundX, FoundY)
Sleep, 1250 ;Delay so the wireless displays have a chance to load into the Action Center window
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, C:\WirelessDisplay.png
if ErrorLevel = 2
MsgBox Could not conduct the search for the wireless display.
else if ErrorLevel = 1
{
;Search image cannot be found. Try 1 more time in case it took a long time for the wireless displays to appear
Sleep, 750
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, C:\WirelessDisplay.png ;try to find the first Wireless Display device listed
if ErrorLevel = 1
MsgBox Wireless display image cannot be found on the screen. Make sure the wireless device is turned on.
else
MoveMouseAndClick(FoundX, FoundY)
}
else
MoveMouseAndClick(FoundX, FoundY)
Send {Esc} ;Send Esc to get rid of the Action Center window
Return
MoveMouseAndClick(x, y) {
MouseMove, x + 25, y + 25 ;Move it down the right a bit to make sure we click the button
Sleep, 250
MouseClick, left
}
Я также приложил изображения в качестве примера того, что я сделал. Вам нужно будет сделать свой собственный поиск изображений. Перед созданием этих изображений необходимо также отключить прозрачность Центра действий, запуска и панели задач в Windows 10 - Настройки-> Персонализация-> Цвета-> Сделать старт, панель задач и Центр действий прозрачными-> Выкл. Особенно важно повторить 2-е изображение, так как мое изображение содержит список "Roku Stick" на изображении. Мне пришлось переделать свой поисковый образ между моей машиной для разработки десктопов и MS Surface 3, на которой я запускаю этот скрипт. Разрешения и тому подобное будут меняться между устройствами. Следуйте инструкциям по созданию собственного изображения для поиска здесь:
https://autohotkey.com/docs/commands/ImageSearch.htm
Наконец, это, вероятно, не будет работать, если беспроводной дисплей уже подключен. В моем окружении подключение беспроводного дисплея приводит к изменению разрешения на планшете и, следовательно, он не может найти изображения на экране.
Сначала я хочу сказать, что @jaredbaszler предоставил действительно хорошее решение. Это работает как шарм, спасибо:)
Я тоже играл с AutoHotkey, так как хотел выяснить, есть ли другой способ сделать это. Через некоторое время я придумал следующий скрипт:
Send #k ; Sends Windows button + K to open the Action Center Connect window
Sleep, 3000 ; Wait some time so the wireless display dongle can be found
Send {Enter} ; Send ENTER key to connect to wireless display dongle (works when only 1 is found)
Send {Esc} ; Send ESC key to close the Action Center Connect window
Хорошо. Теперь позвольте мне объяснить, как работает этот скрипт:
- Сначала он нажмет WIN+K, что откроет окно Action Center Connect
- Затем он будет ждать 3 секунды, чтобы найти беспроводной дисплейный ключ (Вы можете отрегулировать это значение по своему усмотрению, но мне нужно было подождать более 2 секунд, чтобы появился мой беспроводной дисплейный ключ)
- После ожидания он нажмет ENTER, который автоматически выберет первый беспроводной дисплейный ключ в списке и активирует функцию подключения (если беспроводные дисплеи не найдены, ваш браузер по умолчанию откроет ссылку "Помощь")
- Последнее, что делает скрипт, - это нажимает клавишу ESC, чтобы закрыть Центр действий.
Ну вот и все. Ничего особенного, но это работает. Я несколько раз тестировал этот скрипт на своем планшете и беспроводном защитном ключе (он у меня есть), и он, кажется, работает отлично. К сожалению, мой сценарий не будет работать должным образом, если у вас одновременно работает несколько беспроводных дисплеев, потому что мой сценарий просто выберет первый, который появится. (Это не проблема для меня, так как у меня есть только один беспроводной дисплейный ключ)
Это был сценарий AutoHotKey, который я написал;
Run, explorer.exe ms-settings-connectabledevices:devicediscovery
Sleep, 800
Send, {Tab}
Send,+{Tab}
Send,{Enter}
Sleep, 200
; then next Send command types the first few letters of the name of the WiDi adaptor
Send, Microsoft
Sleep, 200
Send, {Tab}
Sleep, 200
Send, {Enter}
Вопрос немного устарел, но в настоящее время я столкнулся с той же проблемой.
Я предлагаю написать приложение UWP, используя ProjectionManager
класс по образцу 5 + 6 в образце Advanced casting.
Основные шаги:
- получение DeviceID (например, путем выбора с помощью
DevicePicker
учебный класс) - вызов
ProjectionManager.StartProjectingAsync(newViewId, currentViewId, selectedDeviceInformation)
чтобы начать проекцию
В DeviceInformation
объект можно получить, позвонив DeviceInformation.CreateFromIdAsync()
используя полученный (и сохраненный) deviceId. ViewIds может иметь значение 0 (или другие недопустимые значения), проекция все равно запускается.
Если проекция запущена, приложение может быть закрыто, проекция продолжает работать.
Если кого-то заинтересует решение, выложу код на GitHub.
Чтобы автоматизировать и контролировать Miracast, вам нужно написать UWP
приложение с помощью Windows.Media.Casting
пространство имен и универсальные образцы Windows.
Они могут быть написаны на многих распространенных языках, включая C#, C++, Javascript и Visual Basic.
Windows предоставила два набора функциональных примеров программ, демонстрирующих, что вы можете делать с Miracast, которые можно открывать и запускать как решения Visual Studio (.sln).
Поскольку приложения UWP предназначены для размещения в магазине приложений Windows, для их работы предъявляются особые требования и правила. (Я рекомендую изучить их.)
Также избегайте ловушки, которую я сделал, когда начал писать универсальную программу, а затем задался вопросом, где находится универсальная библиотека Windows:
В итоге я использовал решение на основе vbs отсюда:https://superuser.com/questions/1062789/how-to-connect-to-a-wireless-display-adapter-automatically-through-scripts-or-ta
Хотя он в основном выполняет те же действия, я нашел его гораздо более надежным, чем другие решения. Более того, vbs доступен (я думаю) на большинстве Win-машин.