Archive

Posts Tagged ‘Win32 API’

アイコンハンドルから WPF 用のアイコンを取得する

アプリケーションのアイコンを WPF で使用するには,アイコンハンドルから ImageSource を生成します。

ImageSource source = Imaging.CreateBitmapSourceFromHIcon(iconHandle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
Image image =  new Image()
{
	Source = source
};

アイコンハンドルの取得方法は目的によって異なりますが,たとえば起動している任意のウィンドウハンドルからアイコンハンドルを取得するには次のようにします。

const int GCL_HICONSM = -34;  // 小サイズアイコンを選択する。
IntPtr iconHandle = GetClassLongPtr(windowHandle, GCL_HICONSM);

[DllImport("user32.dll")]
private static extern IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex);

GetClassLongPtr を使用する場合は,コンパイル条件を Any CPU にすることで, 32bit/64bit のいずれのプラットフォームにも対応させることができます。 WPF アプリケーションのデフォルトは 32bit がターゲットとなっているので注意が必要です。

生活 , ,

アンマネージド DLL を遅延バインディングで使用する

C# からアンマネージドな DLL を使用するには DllImportAttribute を用いた方法が多いのですが,動的に読み込みたい場合もあります。アンマネージド DLL を遅延バインディングするクラスは .NET Framework に用意されていないと思いますので,自前で用意してやる必要があります。

Read more...

Tip, プログラミング ,

スクリーン上でのウィンドウクライアント領域の取得

Win32 API を用いると他のアプリケーションのウィンドウやクライアント領域を取得することができます。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
	public int Left;
	public int Top;
	public int Right;
	public int Bottom;
}

GetClientRect 関数では左上端の座標は常に (0, 0) です。ウィンドウの枠やキャプションバーを除いたクライアント領域のスクリーン上での座標を得るにはウィンドウの四角形から枠を除いて取得することができる気がします。

普通のウィンドウでは枠は左右と下に同じ太さでついていて上にキャプションバーが付いているというスタイルなので,これを仮定すれば簡単にクライアント領域を取得できます。しかしこのようなインターフェイスを本当に仮定してよいのかはよくわかりません。もしかして別の方法でクライアント領域を取得する方法があるのでしょうか。

プログラミング , ,