首页 > 解决方案 > 如何使用 Ruby 和 Win32API 获取 Windows 屏幕方向

问题描述

我试图让 Windows 屏幕方向将某种复活节彩蛋放入游戏中,当显示器倒置时会发生这种情况。

我知道 Fiddle 存在,但这不是我问的问题。如果它不能在 Win32API 中完成,请告诉我,我将放弃这个小功能。

另外,免责声明,Ruby 对我来说不是最熟悉的语言,但我喜欢学习和克服挑战,所以请继续使用它。

  class DisplayData < Struct.new(:dmFields)
    def initialize(dmFields=1); super end
  end

  def Win32API.orientation
    data = DisplayData.new()
    getDisplaySettings = Win32API.new('user32','EnumDisplaySettingsEx','%w(P I P)', 'l')
    getDisplaySettings.call("", -1, (data.object_id << 1))
    return data.dmFields
  end

我觉得我很接近了,我只是觉得我错过了一些重要的事情或者没有正确理解一些重要的事情。

编辑 1:要检测的倒置屏幕应该是应用程序正在运行的屏幕。如果我理解正确,解析 nil 值将返回应用程序正在运行的屏幕的屏幕设置。

标签: rubywinapi

解决方案


在 C++ 中,代码将如下所示:

DEVMODE devMode;
RtlSecureZeroMemory(&devMode, sizeof(DEVMODE));
devMode.dmSize = sizeof(DEVMODE);
devMode.dmFields = DM_DISPLAYORIENTATION;

BOOL result = EnumDisplaySettingsEx(NULL, ENUM_CURRENT_SETTINGS, &devMode, EDS_RAWMODE);
if (result)
{
    DWORD displayOrient = devMode.dmDisplayOrientation; // Get display device orientation
}

要确定显示方向是纵向还是横向,请检查 dmPelsWidth 与 dmPelsHeight 的比率。


推荐阅读