タイトル : [解決]構造体を引数とする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 これが立っていなければ、システム再起動で元の値に戻るってことですよね。 |