tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル [解決]構造体を引数とするAPI(SystemParametersInfo)
投稿日: 2009/10/29(Thu) 22:41
投稿者ダンボ
オショウ さん、Hongliang さん、どうもありがとうございます。

オショウ さんのコードで動作しました。私のコードのどこが悪いのかを色々検証しました。
まず致命的だったのが
    Dim LOGFONT As New LOGFONT(Space(LF_FACESIZE))
    Dim ICONMETRICS As New ICONMETRICS
    ICONMETRICS.lfFont = LOGFONT
のように構造体を2つ論理的につなげたことであり、物理的につながっていませんでした。
このためMarshal.SizeOf(im)がオショウ さんのコードでは108、私のコードでは48でした。
「物理的に連続」ということが重要だったんですね。もう一つ意外だったのは、
<DllImport("USER32.DLL", CharSet:=CharSet.Auto)>Private Function SystemParametersInfo(...
では動作し、
<DllImport("USER32.DLL")>Private Function SystemParametersInfo(...
ではエラーリターンしたことです。構造体データ中に文字列があるからでしょうか。

> > SPI_GETICONMETRICS、SPI_SETICONMETRICSを利用してみました。
> > (SPI_ICONHORIZONTALSPACINGで得られる値は別物ですよね?)
> iHorzSpacing および iVertSpacing に関しては同じです。
> そして、これらは ListView の View.LargeIcon のみに影響する値のはずです。

はい、同じ値でした。実は画面のプロパティ→デザイン詳細→アイコンの間隔(横)=46、
アイコンの間隔(縦)=43という値を得たかったのですが、iHorzSpacing =78、iVertSpacing =75でした。
どうやら画面のプロパティで示す値は32×32アイコンを前提としている感じです。

> > それと第4引数を0にしておけば、このAPPだけに作用して終了後に規定値に戻ると予想して
> いるのですが、当たっているでしょうか?
> この関数はシステム全体の設定を変更するものです。
> また、特に戻ると言うこともありません。

そのとおりでした。APP終了前に元の設定値に戻しておかねば。。。
Private Const SPIF_UPDATEINIFILE As Integer = &H1
これが立っていなければ、システム再起動で元の値に戻るってことですよね。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。