使用 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);
}
}
}
首先,我通读了 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);
}
}
}