スポンサーサイト

■ スポンサー広告 Posted by ひぐま (Higmmer) on -------- at --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] アプリ終了時のウィンドウ位置を保存する

■ プログラム Posted by ひぐま (Higmmer) on 2005-12-06 at 00:47:43

◆共有テーマ: プログラミング [コンピュータ]

最近ちょっとネタ切れ気味になりつつあるので、これから何回かに分けて「DesktopCapture for Skype」を作成するにあたって自分がつまずいた点についてメモ風に書いていくことにします。

まずはVersion 0.6.00βで追加したアプリケーション終了時のウィンドウ位置を保存する機能の実現方法についてです。最初は普通にLocationプロパティの値を保存する方法を思いついたのですが、これだとウィンドウが最小化されている時に(-32000, -32000)のような値となってしまい、次回起動時に正しく復元させることができません。これは位置の取得にWin32APIのGetWindowRect関数を用いた場合でも同様です。

このような場合はGetWindowPlacement関数を用いればいいようです。

以下に実際のコード(見やすいように若干変更しています)を示します。

public class SettingSupport { internal class NativeMethods { [StructLayout(LayoutKind.Sequential)] public struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] public struct WINDOWPLACEMENT { public int Length; public int flags; public int showCmd; public POINT ptMinPosition; public POINT ptMaxPosition; public RECT rcNormalPosition; } [DllImport("user32.dll")] extern public static bool GetWindowPlacement(int hWnd, ref WINDOWPLACEMENT lpwndpl); } public static Point GetNormalWindowLocation(Form form) { NativeMethods.WINDOWPLACEMENT wndpl = new NativeMethods.WINDOWPLACEMENT(); wndpl.Length = Marshal.SizeOf(wndpl); NativeMethods.GetWindowPlacement((int)form.Handle, ref wndpl); return new Point(wndpl.rcNormalPosition.left, wndpl.rcNormalPosition.top); } }

APIリファレンスマニュアルによるとGetWindowPlacement関数を用いる時はWINDOWPLACEMENT構造体のlengthフィールドに構造体のサイズを入れておく必要があるそうです(実際はWindows2000/XP以降では入れなくても動作するようですが)。自分のようなC/C++に慣れたプログラマならsizeof(WINDOWPLACEMENT)と書きたいところですが、C#ではsizeof演算子はunsafeブロック内でしか使えません(しかもunsafeを使ったソースは/unsafeオプションを付けないとコンパイルできません)。そこで上記コードではMarshal.SizeOfメソッドを用いています。このメソッドはインスタンスにしか適用できないので事前にnewを用いてWINDOWPLACEMENT型のインスタンスを生成しています(あーややこし)。実際は構造体のサイズは予め分かっているので定数に置き換えるのも良いかも知れません。

トラックバック

この記事について書く(FC2ブログユーザー)
※言及リンクの無いトラックバックは無効です

PageTop▲

コメント

PageTop▲

コメントの投稿

 
 
 
 
 
 (後で編集・削除したいなら必須)
 
  

PageTop▲

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。