Привет всем, я работаю над проектом по отслеживанию местоположения текущего активного окна, над которым работает пользователь. Он отлично работает на одном дисплее или дисплеях с одинаковыми настройками DPI. Но он не работает на мониторах с разными DPI / масштабными коэффициентами.
Феномен состоит в том, что приложение, написанное на WinForms, может получить правильный прямоугольник для окон на том же экране, на котором находится приложение. Не может найти правильный для других приложений.
Я использовал метод https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowrect, чтобы получить прямоугольник с помощью ручки.
Версия .NET Framework, которую я использовал для сборки: 4.7
Я уже установил DPI в app.manifest, как это, и использовал
[DllImport("user32.dll"]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[DllImport("user32.dll"]
public static extern bool SetProcessDPIAware();
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<appSettings>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
Здесь я приведу пример. Допустим, есть только два монитора: первый с DPI 100%, второй с DPI 150%. Приложение находится на мониторе со 100% DPI. Для окон на мониторе 100% DPI координаты на переднем плане приложения являются правильными.
Но для окон с разрешением 150% я не получу правильное значение, координаты, которые я вижу, выглядят примерно так, как приложение вычисляет координаты в 100%, так же, как использует экранное приложение.