Автоматическое подключение к дисплею 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

Хорошо. Теперь позвольте мне объяснить, как работает этот скрипт:

  1. Сначала он нажмет WIN+K, что откроет окно Action Center Connect
  2. Затем он будет ждать 3 секунды, чтобы найти беспроводной дисплейный ключ (Вы можете отрегулировать это значение по своему усмотрению, но мне нужно было подождать более 2 секунд, чтобы появился мой беспроводной дисплейный ключ)
  3. После ожидания он нажмет ENTER, который автоматически выберет первый беспроводной дисплейный ключ в списке и активирует функцию подключения (если беспроводные дисплеи не найдены, ваш браузер по умолчанию откроет ссылку "Помощь")
  4. Последнее, что делает скрипт, - это нажимает клавишу 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:

Запуск проекта UWP

В итоге я использовал решение на основе vbs отсюда:https://superuser.com/questions/1062789/how-to-connect-to-a-wireless-display-adapter-automatically-through-scripts-or-ta

Хотя он в основном выполняет те же действия, я нашел его гораздо более надежным, чем другие решения. Более того, vbs доступен (я думаю) на большинстве Win-машин.

Другие вопросы по тегам