tagCANDY CGI ChangeDisplaySettingsで解像度の変更
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
ChangeDisplaySettingsで解像度の変更
このスレッドはロックされています。記事の閲覧のみとなります。
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

ChangeDisplaySettingsで解像度の変更 [No.116の個別表示]
日時: 2008/09/22 19:35
名前: あーちゃん

Access2007で開発を行っています。

API関数「ChangeDisplaySettings」を使って、解像度の変更を行いたいのですが、
必ず、DISP_CHANGE_FAILED(設定に失敗しました)が返ってきてしまいます。
その原因がわからず、途方に暮れております。

以下が、私が記述した解像度変更部分のプログラムの内容です。

Option Compare Database
Option Explicit

'解像度の変更
Private Const DM_BITSPERPEL = &H40000
Private Const DM_PELSWIDTH = &H80000
Private Const DM_PELSHEIGHT = &H100000
Private Const CDS_UPDATEREGISTRY = &H1&
Private Const CDS_TEST = &H4&
Private Const DISP_CHANGE_SUCCESSFUL = 0&
Private Const DISP_CHANGE_RESTART = 1&

Private Type DEVMODE '定義を簡略化しています。
dmDeviceName(0 To 7) As Long
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dummy(0 To 29) As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" ( _
ByVal lpszDeviceName As Long, _
ByVal iModeNum As Long, _
ByRef lpDevMode As Any) As Long

Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" ( _
ByRef lpDevMode As Any, _
ByVal dwFlags As Long) As Long

Public Sub JSyoriStart(MENU_TAG As String)
'解像度の変更(800*600 32bit)
Call Com_ChangeDisplay(1)
End Sub

Public Function Com_EnumDisplaySetting()
'***********************************************************
'機能 : 設定可能なディスプレイモードを列挙する
'戻り値: DModeList配列にDEVMODEをセット
'***********************************************************
Dim dm As DEVMODE
Dim i As Long
i = 0
Do Until EnumDisplaySettings(0, i, dm) = 0
i = i + 1
Loop

End Function

Sub Com_ChangeDisplay(p_Flag As Long)
'***********************************************************
'機能 : 指定した画面解像度に変更する
'引数 : p_Flag = 変更する解像度のパターン
'戻り値: 実行結果
'***********************************************************
Dim p_Width As Long
Dim p_Height As Long
Dim p_BitsPerPel As Integer
Dim p_Ret As Long
Dim dm As DEVMODE

Select Case p_Flag
Case 1
p_Width = 800
p_Height = 600
Case 2
p_Width = 1280
p_Height = 1024
End Select

p_BitsPerPel = 32

'解像度の変更
dm.dmSize = Len(dm)
dm.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
dm.dmPelsWidth = p_Width
dm.dmPelsHeight = p_Height
dm.dmBitsPerPel = p_BitsPerPel
p_Ret = ChangeDisplaySettings(dm, CDS_TEST)

Select Case p_Ret
Case DISP_CHANGE_SUCCESSFUL
i = MsgBox("OK", vbOKOnly)
Case Else
i = MsgBox("NG", vbOKOnly)
End Select

End Sub

どなたかご教授下さい。
 よろしくお願い致します。
メンテ

Page: 1 |

Re: ChangeDisplaySettingsで解像度の変更  (No.1) [スレッド一覧へ]
日時: 2008/12/16 12:43
名前: 花ちゃん

下記で同じ質問をされている方ですよね、マルチポストはマナー違反です。
マルチポストする時間があるなら、関数名で検索してご自分で調べて見て下さい。
(誠意のある対応をされるなら、解答をするかも、でもあまり見ていないようだし、因みに
間違いは2ヶ所です。)

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46510&forum=12

ついでに、ここはプログラムに関する質問をする掲示板ではありません。

※ 当サイトをご利用になるのなら、初めにお読み下さい を読んでからご利用願います。
メンテ
Re: ChangeDisplaySettingsで解像度の変更  (No.2) [スレッド一覧へ]
日時: 2008/09/23 13:52
名前: あーちゃん

ご返信ありがとうございます。
マナー違反だとは知りませんでした。無知ですみません。
花ちゃんさんの言うとおり、私が書いた質問は、別のところでも投稿しましたが、
あの掲示板は、JavaScriptの掲示板だったので、間違えたと思い、お詫び文章を投稿してあります。
ただ消していれば、何の問題もなかったんでしょうかね。
ご指摘ありがとうございます。

何日もかけて、関数を調べたり、同じようなことが書いているサイトを調べたりしてきました。
なので、あまり見ていないようだしといわれるのは、ちょっと引っかかりますが、
今後気をつけます。
プログラムに関する質問をする掲示板とは知らずに、申し訳ありませんでした。

メンテ
Re: ChangeDisplaySettingsで解像度の変更  (No.3) [スレッド一覧へ]
日時: 2008/09/24 14:24
名前: 花ちゃん

間違っているところ解りましたか? その後ちょこ ちょこ 覗いておられるようなので
ヒントだけ。
テキストボックスに何行か文書が書いてあって、その中の4行目と5行目の文字列を
書き直したい場合、どのようにしますか?
新しいテキストボックスに4行目と5行目の文字列を書いたらその文書の4行目と5行目の
内容だけが変更できますか?
元の文書を取得してその中の4行目と5行目だけを変更するようにしないとそのテキスト
ボックスの内容の4行目と5行目を変更した事にならないでしょう。
DEVMODE 構造体でも同じ事で、Dim dm As DEVMODE で中身が空の構造体に、解像度の
データだけを書き込んで使ったらどうなりますか?

上記を踏まえて下記の検索結果を片っ端から見て下さい。
(特に2番目・4番目あたりは参考になるはず)
http://tinyurl.com/3rkuts

# Windows98 以前なら投稿されたコードでも動くようです、参考にされたサイトはその当時の
 コードかと思います。

メンテ
Re: ChangeDisplaySettingsで解像度の変更  (No.4) [スレッド一覧へ]
日時: 2008/09/24 14:37
名前: あーちゃん

ご返信ありがとうございます。

ヒントありがとうございます。
午前中いっぱいまで煮詰まっていた私も、すんなりと理解することができました。

おかげで、ヒントと教えて頂いた検索結果を参考にさせて頂き、
解決することができました。
間違えていた根本的な原因は、花ちゃんのヒント通りのことでした。
本当にありがとうございました。

今回、掲示板に書き込むことは初めてで、ネット上のルール違反をしたり、サイトの注意事項を読まずに投稿してしまったことは、軽率な行動であり、反省点がたくさんありました。

ほんとうにありがとうございました。
メンテ

Page: 1 |