使用 Windows.Devices.WiFiDirect 自动连接 Microsoft 显示适配器

Autoconnect with Microsoft Display Adapter using Windows.Devices.WiFiDirect

首先,我通读了 Autoconnect to MS Wireless display on Windows 10 并基本上尝试了所有解决方案。 (从技术上讲,我确实让 AutoHotKey 解决方案工作了,事实上,在研究之前就已经做到了。但是,我觉得这有点不专业,而且肯定有一些 API 可以连接到这个东西。)在经历了所有之后其中,我刚刚开始阅读不同的命名空间。最后,我找到了Windows.Devices.WiFiDirect。这给了我我所能取得的最大进步,即它开始连接并在屏幕上这样说,然后发生异常,表明设备无法访问。很气人。

谁能准确解释这里发生了什么?看起来这应该是将我的屏幕连接到此设备的正确方法,但它就是不工作。下面的代码,它非常简短明了。

编辑:

根据 Roy Li 的建议,我尝试使用 socket.ConnectAsync 方法的不同重载。这实际上确实有影响,但我仍然收到一个例外,尽管是一个不同的例外。该方法现在尝试连接更长时间但仍然失败,这次出现“连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应”异常。这是否意味着 Window 的 OS 在连接到此设备时正在使用某种秘密握手?如果是这样,这可能是一个死胡同。代码已更新如下。

        static async Task Main()
        {
            string id = null;
            string prefix = "MicrosoftDisplayAdapter";
            WiFiDirectDevice device;
            StreamSocket socket = new StreamSocket();

            try
            {
                DeviceInformationCollection devInfoCollection = await DeviceInformation.FindAllAsync(WiFiDirectDevice.GetDeviceSelector());
                foreach (DeviceInformation devInfo in devInfoCollection)
                {
                    if (devInfo.Name.StartsWith(prefix))
                    {
                        id = devInfo.Id;
                    }
                }
                device = await WiFiDirectDevice.FromIdAsync(id);
                var endpointPairCollection = device.GetConnectionEndpointPairs();
                await socket.ConnectAsync(endpointPairCollection[0].RemoteHostName, "50001"); //This line begins connecting to the display but ultimately fails
            }
            catch (Exception e)
            {
                //device unreachable exception
            }
        }

我终于找到了符合我需要的东西。我遇到了 https://social.msdn.microsoft.com/Forums/en-US/7608d127-d864-436a-802e-472fd55cc02c/use-projectionmanager-from-net-framework?forum=csharpgeneral,它为我提供了 cast/project 到 Microsoft 显示适配器的方法。正如 link 所述,我确实遇到了“灾难性错误”,但它确实建立了连接并保持连接,无论如何。我的代码最终如下所示:

        static async Task Main()
        {
            string prefix = "MicrosoftDisplayAdapter";
            DeviceInformation displayAdapter = null;

            try
            {
                //Get projection devices
                DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(ProjectionManager.GetDeviceSelector());
                foreach (DeviceInformation device in devices)
                {
                    if (device.Name.StartsWith(prefix))
                    {
                        displayAdapter = device;
                    }
                }
                //Start projection.  This throws an error but works without issue.
                await ProjectionManager.StartProjectingAsync(0, 0, displayAdapter);
            }
            catch (Exception e)
            {
                //Ignore this error
                if (e.Message.StartsWith("Catastrophic"))
                {
                    //Change display to use secondary only
                    Process proc = new Process();
                    proc.StartInfo.UseShellExecute = true;
                    proc.StartInfo.CreateNoWindow = true;
                    proc.StartInfo.FileName = @"C:\Windows\Sysnative\DisplaySwitch.exe";
                    proc.StartInfo.Arguments = "/external";
                    proc.Start();
                    proc.WaitForExit();
                }
                else
                {
                    Console.WriteLine(e);
                }
            }
        }