Есть ли способ в Windows, который может получить правильный прямоугольник для приложения переднего плана с поддержкой DPI? - PullRequest
0 голосов
/ 10 июня 2019

Привет всем, я работаю над проектом по отслеживанию местоположения текущего активного окна, над которым работает пользователь. Он отлично работает на одном дисплее или дисплеях с одинаковыми настройками 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%, так же, как использует экранное приложение.

1 Ответ

0 голосов
/ 11 июня 2019

«поддержка каждого монитора DPI» введена в Windows 8.1, если ваша версия Windows старше 8.1, то вы не имеете к этому никакого отношения.

Если версия windows> = 8, то в соответствии с документом , <dpiAware>true</dpiAware> только установите значение PROCESS_SYSTEM_DPI_AWARE в вашем приложении. Чтобы включить PROCESS_PER_MONITOR_DPI_AWARE: <dpiAware>true/PM</dpiAware>

И другие ссылки: Поддержка высокого разрешения в Windows Forms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...