Подтвердить что ты не робот

Автосоединение к дисплею MS Wireless в Windows 10

Я хочу написать службу Windows (в С#) или скрипт powershell, который автоматически подключает мой ноутбук (при загрузке или комбинации клавиш) к моему беспроводному адаптеру дисплея MS для зеркального отображения экрана. В Windows 10 я могу сделать это только вручную, перейдя в уведомления и нажав Подключиться> Беспроводной адаптер MS> Подключиться.

Я обнаружил, что есть Miracast API, но не так много документации о том, как его использовать.

Я также нашел эту документацию на MiraDisp.dll и есть две функции OpenMiracastSession и CloseMiracastSession.

Проблема в том, что я не знаю, как использовать эти функции в С#. Я знаю, что мне, вероятно, придется использовать pInvoke. Может кто-то указать мне верное направление?

4b9b3361

Ответ 1

Прежде всего, спасибо @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 - Settings-> Персонализация → Colors-> Сделать старт, панель задач и центр действий transparent-> Выкл. Особенно важно повторить 2-е изображение, так как мое изображение содержит список "Roku Stick" на изображении. Мне пришлось переделать свой поисковый образ между моей машиной для разработки десктопов и MS Surface 3, на которой я запускаю этот скрипт. Разрешения и тому подобное будут меняться между устройствами. Следуйте инструкциям по созданию собственного изображения для поиска здесь:

https://autohotkey.com/docs/commands/ImageSearch.htm

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

Image of the connect button in Action Center
enter image description here

Ответ 2

Сначала я хочу сказать, что @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, чтобы закрыть Центр действий.

Ну вот и все. Ничего особенного, но это работает. Я тестировал этот скрипт несколько раз с моим планшетом и моим беспроводным адаптером дисплея ( у меня есть эта здесь), и это, кажется, работает нормально. К сожалению, мой сценарий не будет работать должным образом, если у вас одновременно работает несколько беспроводных донглов, потому что мой сценарий просто выберет первый, который появится. (Это не проблема для меня, так как у меня есть только один беспроводной дисплейный ключ)

Ответ 3

Вопрос немного старый, но в настоящее время я столкнулся с той же проблемой.

Я предлагаю написать приложение UWP, использующее класс ProjectionManager соответствии с образцом 5 + 6 в образце Advanced Casting.

Основные этапы:

  • получение идентификатора устройства (например, с DevicePicker класса DevicePicker)
  • вызов ProjectionManager.StartProjectingAsync(newViewId, currentViewId, selectedDeviceInformation) для запуска проецирования

Объект DeviceInformation может быть получен путем вызова DeviceInformation.CreateFromIdAsync() с использованием полученного (и сохраненного) deviceId. ViewIds может быть установлен в 0 (или другие недопустимые значения), проекция все равно начинается.

Если проекция запущена, приложение можно закрыть, проекция все еще сохраняется.

Если кто-то заинтересован в решении, я выложу код на GitHub.

Ответ 4

Чтобы автоматизировать и управлять Miracast, вы хотите написать приложение UWP, используя пространство имен Windows.Media.Casting и универсальные образцы Windows.

Они могут быть написаны на многих распространенных языках, включая С#, C++, Javascript и Visual Basic.

Windows предоставила два набора функциональных примеров программ, демонстрирующих, что вы можете делать с Miracast, которые можно открывать и запускать как решения Visual Studio (.sln).

Основной кастинг

Продвинутый кастинг

Поскольку приложения UWP предназначены для предоставления в магазине приложений Windows, у них есть особые требования и правила для работы. (Я рекомендую исследовать их.)

Также избегайте ловушки, которую я допустил, когда начал писать универсальную программу, а затем поинтересовался, где находится библиотека Universal Windows:

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

Ответ 5

Это был сценарий 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}