イワンの答えはうまくいきませんでした。xrandr は 2013 年から変更されたと思いますか? コマンドライン ツールxrandr
は私のリフレッシュ レートを正しく読み取ることができますが、そのソース コードが複雑すぎて、その方法を真似することはできません。代わりに、私はぎこちなく作業をxrandr
プログラム全体に委任することにしました。私のくだらない解決策を以下に貼り付けます。
このソリューションは、複数のディスプレイ デバイスが接続されている場合は信頼性が低くなる可能性があり、xrandr
変更が再び行われるといつか機能しなくなる可能性があることに注意してください。
(pstream.h は、Jonathan Wakely の PStreams ライブラリによって提供されます。こちらを参照してください: https://stackoverflow.com/a/10702464/1364776
コマンドの出力をstd::string
;に変換するためにのみ使用しています。もちろん、他にもさまざまな方法があるので、必要に応じていずれかを使用してください。)
#include <pstream.h>
#include <cctype>
#include <cstdlib>
#include <cmath>
float getRefreshRate()
{
try
{
redi::ipstream queryStream("xrandr");
std::string chunk;
while (queryStream >> chunk)
{
auto rateEnd = chunk.find("*");
if (rateEnd != std::string::npos)
{
auto rateBeginning = rateEnd;
while (std::isdigit(chunk[rateBeginning]) || std::ispunct(chunk[rateBeginning]))
--rateBeginning;
++rateBeginning;
auto numberString = chunk.substr(rateBeginning, rateEnd - rateBeginning);
float rate = std::strtof(numberString.data(), nullptr);
if (rate != 0 && rate != HUGE_VALF)
return rate;
}
}
}
catch (...)
{
}
return 60; // I am not proud of any of this :(
}