C++
1int CMFCApplication8App::GetWindowDpi(HWND hWnd)2{3 HDC hdc = GetDC(hWnd);4 int dpi = GetDpiForWindow(hWnd);5 ReleaseDC(hWnd, hdc);6 return dpi;7}8 9int CMFCApplication8App::GetLogicalCoordinate(int physicalCoordinate, int dpi)10{11 // 物理ピクセル座標を論理座標に変換12 return MulDiv(physicalCoordinate, 96, dpi);13}14 15void CMFCApplication8App::GetScreenAndSaveAsJPGInExeDirectory()16{17 // ウィンドウを非表示にする18 CWnd* pMainWnd = AfxGetApp()->GetMainWnd();19 if (pMainWnd)20 {21 pMainWnd->ShowWindow(SW_HIDE);22 }23 24 int numDisplays = GetSystemMetrics(SM_CMONITORS); // 接続されているディスプレイの数を取得25 26 for (int i = 0; i < numDisplays; i++)27 {28 // ディスプレイごとにモニターハンドルを取得29 HMONITOR hMonitor = GetMonitor(i);30 31 // 各ディスプレイの情報を取得32 MONITORINFOEX monitorInfo;33 monitorInfo.cbSize = sizeof(MONITORINFOEX);34 35 if (GetMonitorInfo(hMonitor, &monitorInfo))36 {37 // モニターの座標とサイズを取得38 int screenWidth = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left;39 int screenHeight = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;40 int screenLeft = monitorInfo.rcMonitor.left;41 int screenTop = monitorInfo.rcMonitor.top;42 /* 43 // デバッグ出力にディスプレイの情報を出力 44 TRACE(_T("Display %d - Width: %d, Height: %d, Left: %d, Top: %d\n"), i, screenWidth, screenHeight, screenLeft, screenTop); 45 / 46 // ディスプレイの物理座標系に変換*/47 int dpi = GetWindowDpi(m_pMainWnd->m_hWnd); // メインウィンドウのDPIを取得48 /*int physicalLeft = MulDiv(monitorInfo.rcMonitor.left, dpi, 96); 49 int physicalTop = MulDiv(monitorInfo.rcMonitor.top, dpi, 96); 50 int physicalWidth = MulDiv(monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left, dpi, 96); 51 int physicalHeight = MulDiv(monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top, dpi, 96); 52 / 53 // 物理ピクセル座標を論理座標に変換 54 int scaledScreenWidth = GetLogicalCoordinate(screenWidth, dpi); 55 int scaledScreenHeight = GetLogicalCoordinate(screenHeight, dpi); 56 int scaledScreenLeft = GetLogicalCoordinate(screenLeft, dpi); 57 int scaledScreenTop = GetLogicalCoordinate(screenTop, dpi);*/58 59 60 61 // スクリーンキャプチャ用のデバイスコンテキストを作成62 HDC screenDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);63 64 // CImage オブジェクトを作成して画像を保存65 CImage screenshot;66// if (screenshot.Create(scaledScreenWidth, scaledScreenHeight, 32) != S_OK)67// if (screenshot.Create(physicalWidth, physicalHeight, 32) != S_OK)68 if (screenshot.Create(screenWidth, screenHeight, 32) != S_OK)69 {70 // 画面全体をビットマップにコピー71 BitBlt(screenshot.GetDC(), 0, 0, screenWidth, screenHeight, screenDC, screenLeft, screenTop, SRCCOPY);
0 コメント