ほとんど最小限例:私は常に取得していますCreateFileでディスプレイを開くときの正しいパスは何ですか?
#include <Windows.h>
#include <ntddvdeo.h>
#include <string>
std::string GetLastErrorAsString()
{
LPSTR msgBuffer = nullptr;
DWORD errorMessageID = ::GetLastError();
std::string msg("No Error");
if(errorMessageID != 0)
{
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errorMessageID,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT),
(LPSTR)&msgBuffer,
0,
NULL);
msg = std::string(msgBuffer, size);
//Free buffer
LocalFree(msgBuffer);
}
return msg;
}
int APIENTRY wWinMain( _In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DWORD nOutBufferSize = 0;
DWORD result = NULL;
typedef struct _DISPLAY_BRIGHTNESS {
UCHAR ucDisplayPolicy;
UCHAR ucACBrightness;
UCHAR ucDCBrightness;
} DISPLAY_BRIGHTNESS, *PDISPLAY_BRIGHTNESS;
DISPLAY_BRIGHTNESS displayBrightness;
displayBrightness.ucDisplayPolicy = 0;
displayBrightness.ucACBrightness = 50;
displayBrightness.ucDCBrightness = 0;
nOutBufferSize = sizeof(displayBrightness);
HANDLE h = CreateFile( L"\\\\.\\DISPLAY2",
GENERIC_READ | GENERIC_WRITE,
0, NULL,
OPEN_EXISTING,
0, NULL);
if (h == INVALID_HANDLE_VALUE) {
MessageBoxA(NULL, GetLastErrorAsString().c_str(), "Test",
MB_OK | MB_ICONERROR);
return false;
}
return true;
}
は、管理者としてのVisual Studioを実行している場合でも、CreateFile
後に「アクセスが拒否されました」。だから、もしも\\.\DISPLAY2
が認識されないならば、Windowsはそこでデバイス名/パスとして何を受け入れますか?あなたは物理的なモニターへのハンドルをしたい場合は、EnumDisplayMonitors
のコールバックからHMONITOR
を取得し、GetPhysicalMonitorsFromHMONITOR
の引数としてそれを使用
Found Monitor with 1920x1080 called \\.\DISPLAY1 located at 0:00
Found Monitor with 1680x1050 called \\.\DISPLAY2 located at -1680:240
を見つけたそして、あなたは、このようなハンドルを行うことができるように何を期待していますか? – andlabs
@andlabs DeviceIoControlで使用したい – BadSnowflake