MagnetWindow Specification

目次

マルチモニタ環境での各機能の動作
優先順位
負荷軽減、処理簡便のための制限
動作しないことが確認されているもの
ExcWnd.txtについて
MgntErr.logにについて
タイトルバーのないアプリケーションを作成している方へ

最新版のダウンロード
マグネットウィンドウマニュアル

マルチモニタ環境での各機能の動作

シングルモニタとマルチモニタ環境での動作の違い。
機能 領域
デスクトップにウィンドウがひっつく 各モニタのデスクトップ領域
グリッドにひっつく(本数設定) 各モニタのデスクトップ領域
グリッドにひっつく(ピクセル設定) 各モニタのデスクトップ領域
マグネットウィンドウマップ表示 仮想デスクトップ領域
仮想デスクトップ領域に中央表示"ON" 仮想デスクトップ領域
仮想デスクトップ領域に中央表示"OFF" プライマリデスクトップ領域
偶数台の時モニタ間にまたがない 仮想デスクトップ領域から自ウィンドウ分中央からずらして表示
仮想デスクトップ領域とは、数台のモニタのデスクトップ領域全てを内包する矩形領域。
各モニタのデスクトップ領域とは、モニタ1枚1枚の矩形領域。

優先順位

マグネットウィンドウは処理上、ひっつく場所に優先順位がある。
概要 優先順位
ウィンドウ移動時の優先順位 デスクトップからはみ出さない>デスクトップ>タスクバー>ウィンドウ>グリッド(ピクセル設定)>グリッド(本数設定)
子ウィンドウ移動時の優先順位 MDIウィンドウからはみ出さない>MDI親ウィンドウ>子ウィンドウ
ウィンドウサイズ変更時の優先順位 子ウィンドウに親がひっつく(サイズ変更時)>デスクトップ>タスクバー>ウィンドウ>グリッド(ピクセル設定)>グリッド(本数設定)
子ウィンドウサイズ変更時の優先順位 MDI親ウィンドウ>子ウィンドウ
ウィンドウ同士の時の優先順位 最後に取得したウィンドウ>最初に取得したウィンドウ
子ウィンドウ同士の時の優先順位 最後に取得したウィンドウ>最初に取得したウィンドウ
スナップの優先順位 左>右 下>上
グリッドの描画順位 左上>右下

制限

マグネットウィンドウは負荷軽減、処理簡便のために最大数を設ける。これらを超えた部分については認識しない。
概要 最大数
ウィンドウ認識最大数 256個
子ウィンドウ認識最大数 256個
モニター認識最大数 25個
無効ウィンドウリスト認識最大数 64個
クラス名/タイトル名の認識範囲 64文字(終端含む)
半透明ウィンドウ値保持最大数 256個
通信ウィンドウ認識最大数 8個

動作しないことが確認されているもの

ExcWnd.txtについて

ExcWnd.txtはテキストエディタで編集が可能。
オリジナルはMgntWnd.exe直下にあるExcWnd.org。
保存場所は{Application Data}\3rd Project\MagnetWindow\
{Application Data}の位置
WinXP:C:\Documents and Settings\(あなたのPCのログイン名)\Application Data\
WinVista以降:C:\Users\(あなたのPCのログイン名)\AppData\Roaming\
データの並び
奇数行: クラス名
偶数行: タイトル名

MgntErr.logについて

想定内でまれな動作と、想定外の動作を作者が検証をするためのログファイル。1MBを超えると削除して書き直し。
保存場所は{Application Data}\3rd Project\MagnetWindow\
{Application Data}の位置
WinXP:C:\Documents and Settings\(あなたのPCのログイン名)\Application Data\
WinVista以降:C:\Users\(あなたのPCのログイン名)\AppData\Roaming\

タイトルバーのないアプリケーションを作成している方へ

タイトルバーのないウィンドウを作った時に、ウィンドウの移動をWM_LBUTTONDOWNやOnLButtonDownとSetWindowPos等のウィンドウ移動系APIを使って自前で作ってしまうとマグネットウィンドウは動作しません。もっと簡単に書けるしマグネットウィンドウも動作する方法を以下に挙げます。
非MFC(WindowsSDK + C): (タイトルバーとサイズ変更枠がある場合)
LRESULT CALLBACK
WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
	case WM_NCHITTEST:
		wParam = DefWindowProc(	hwnd, message,
					wParam, lParam);
		if(	10 <= wParam ||
			17 >= wParam ||
			HTCLIENT == wParam){
			return HTCAPTION;
		}
		else{
			return wParam;
		}
		break;
...以下省略
}
NCHITTESTでマウスが何処をつかんでいるかを取得し、サイズ変更(wparamが10から17)かクライアントの場合はタイトルバーをつかんでいるぞと言う情報を返しています。
MFC: (タイトルバーの無いウィンドウ)
void CWnd、CDialog系::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するか...

	LPARAM lParam;
	lParam = MAKELPARAM(point.x, point.y);
	PostMessage(WM_NCLBUTTONDOWN, (WPARAM)HTCAPTION, lParam);

	CDialog::OnLButtonDown(nFlags, point);
}
こちらはもっと簡単に、クライアント内をクリックするとOnLButtonDownが来るので、タイトルバーをつかんでいるぞとPostMessageします。  他言語でもこの手のメッセージ処理を行えば自前でウィンドウ移動を用意しなくてもよくなります。