質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

1364閲覧

SetPrinter()を実行するとエクスプローラーのスクロールバーが勝手に上に移動する。

tyomesuke

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2020/09/19 11:54

編集2020/09/19 11:57

前提・実現したいこと

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++
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問