気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
以下のような処理を一定間隔(20ミリ秒程度)で繰り返し実行することで追従できます。
一定間隔の繰り返し処理は、DispatcherTimer
クラス(System.Windows.Threading)でできます。
- 追従したいウィンドウAの
ウィンドウハンドル
を取得する
私も昔似たようなものを作ったことがありまして、フォアグラウンドウィンドウに追従するようにしていました。Windows APIのGetForegroundWindow
関数で、呼び出し時点でフォアグラウンド(操作対象)になっているウィンドウのハンドルを取得できます。
あらかじめ決まったウィンドウに追従させたい場合は、その仕様によって方法が変わりますが、とにかくウィンドウハンドルさえ取得すれば2の処理ができます。
- 1で取得したウィンドウハンドルを使って、ウィンドウAの位置情報を取得する
Windows APIのGetWindowRect
関数で取得できます。
- ウィンドウBの座標をウィンドウAの上になるように設定する
MainWindowのLeft
プロパティとTop
プロパティがウィンドウのX座標とY座標になります。移動させたい座標を計算してそれを設定すればウィンドウの位置を変更できます。
サンプルコード
C#
1using System.Windows.Threading; 2using System.Runtime.InteropServices; 3using System.Windows.Interop; 4 : 5 : 6 7// MainWindowの中 8 9private DispatcherTimer dispatcherTimer = new DispatcherTimer(); 10private IntPtr hwndThis; 11 12private void Window_Loaded(object sender, RoutedEventArgs e) 13{ 14 dispatcherTimer.Interval = new TimeSpan(200000); // 100ナノ秒単位で指定 15 dispatcherTimer.Tick += dispatcherTimer_Tick; 16 dispatcherTimer.Start(); 17 18 // Windowクラスのプロパティにウィンドウハンドルがないので取得して覚えておく 19 var hwndSource = HwndSource.FromVisual(this) as HwndSource; 20 hwndThis = hwndSource.Handle; 21} 22 23private void dispatcherTimer_Tick(object sender, EventArgs e) 24{ 25 IntPtr hwnd = GetForegroundWindow(); 26 if(hwnd == hwndThis) // 自分自身への追従はしない 27 return; 28 29 RECT rect = new RECT(); 30 GetWindowRect(hwnd, ref rect); 31 this.Left = rect.left; 32 this.Top = rect.top - this.Height; 33} 34 35[DllImport("user32.dll")] 36private static extern IntPtr GetForegroundWindow(); 37 38struct RECT 39{ 40 public int left; 41 public int top; 42 public int right; 43 public int bottom; 44} 45 46[DllImport("user32.dll")] 47[return: MarshalAs(UnmanagedType.Bool)] 48private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
補足
位置だけ変えても別のウィンドウに隠れる可能性があるため、Windowの共通でTopmost
にチェックを入れると(Topmost="True")常に見えるようになります。
追記
自身がフォアグラウンドしたときにどこかに行ってしまわないようにサンプルコードを修正しました。参照するアセンブリにSystem.Windows
を追加してください。
投稿2016/05/01 14:09
編集2016/05/02 06:45総合スコア5944
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/05/02 06:00
2016/05/02 06:42
退会済みユーザー
2016/05/02 08:13