前提・実現したいこと
SetPrinter関数でプリンタの設定を変更した時、エクスプローラーのスクロールバーが勝手に移動しないようにしたい。
発生している問題・エラーメッセージ
いつもお世話になっております。 現在Win32APIを勉強中で、SetPrinter関数を実行してプリンタの設定を変更するプログラムを作っています。 SetPrinter関数を実行してプリンタの設定は出来るのですが、エクスプローラーを開いてスクロールバーを下にした状態でこの関数を実行すると、スクロールバーが勝手に上に移動してしまいます。 恐らく、SetPrinter関数を実行した時にウィンドウを更新してるのだろうと思うのですが、原因がわかりません。
該当のソースコード
#include <windows.h> #include <winspool.h> #pragma comment(lib, "winspool.lib") BOOL MySetPrinter(LPTSTR pPrinterName, short dmOrientation); int main() { TCHAR szBuff[] = TEXT("Microsoft XPS Document Writer"); LPTSTR printer = &szBuff[0]; BOOL result = MySetPrinter(printer, DM_ORIENTATION); return 0; } BOOL MySetPrinter(LPTSTR pPrinterName, short dmOrientation) { HANDLE hPrinter = NULL; DWORD dwNeeded = 0; PRINTER_INFO_2* pi2 = NULL; DEVMODE* pDevMode = NULL; PRINTER_DEFAULTS pd; BOOL bFlag; LONG lFlag; ZeroMemory(&pd, sizeof(pd)); pd.DesiredAccess = PRINTER_ALL_ACCESS; bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd); if (!bFlag || (hPrinter == NULL)) { return FALSE; } SetLastError(0); bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded); if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0)) { ClosePrinter(hPrinter); return FALSE; } pi2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwNeeded); if (pi2 == NULL) { ClosePrinter(hPrinter); return FALSE; } bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded); if (!bFlag) { GlobalFree(pi2); ClosePrinter(hPrinter); return FALSE; } if (pi2->pDevMode == NULL) { dwNeeded = DocumentProperties(NULL, hPrinter, pPrinterName, NULL, NULL, 0); if (dwNeeded <= 0) { GlobalFree(pi2); ClosePrinter(hPrinter); return FALSE; } pDevMode = (DEVMODE*)GlobalAlloc(GPTR, dwNeeded); if (pDevMode == NULL) { GlobalFree(pi2); ClosePrinter(hPrinter); return FALSE; } lFlag = DocumentProperties(NULL, hPrinter, pPrinterName, pDevMode, NULL, DM_OUT_BUFFER); if (lFlag != IDOK || pDevMode == NULL) { GlobalFree(pDevMode); GlobalFree(pi2); ClosePrinter(hPrinter); return FALSE; } pi2->pDevMode = pDevMode; } if (!(pi2->pDevMode->dmFields & DM_ORIENTATION)) { GlobalFree(pi2); ClosePrinter(hPrinter); if (pDevMode) GlobalFree(pDevMode); return FALSE; } pi2->pDevMode->dmFields = DM_ORIENTATION; pi2->pDevMode->dmOrientation = dmOrientation; pi2->pSecurityDescriptor = NULL; lFlag = DocumentProperties(NULL, hPrinter, pPrinterName, pi2->pDevMode, pi2->pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER); if (lFlag != IDOK) { GlobalFree(pi2); ClosePrinter(hPrinter); if (pDevMode) GlobalFree(pDevMode); return FALSE; } bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0); if (!bFlag) { GlobalFree(pi2); ClosePrinter(hPrinter); if (pDevMode) GlobalFree(pDevMode); return FALSE; } SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L, (LPARAM)(LPCSTR)pPrinterName, SMTO_NORMAL, 1000, NULL); if (pi2) GlobalFree(pi2); if (hPrinter) ClosePrinter(hPrinter); if (pDevMode) GlobalFree(pDevMode); return TRUE; }
試したこと
エクスプローラーを開いてスクロールバーを一番したに移動。
その後、プログラムを実行。
SetPrinter関数実行後、エクスプローラーを確認すると、スクロールバーが一番上に移動していることを確認。
補足情報(FW/ツールのバージョンなど)
Windows 10 64bit
VisulStudio2019
WindowsSDK Version 10.0
C++
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー