回答編集履歴

2

サンプルコード修正

2016/05/02 06:45

投稿

catsforepaw
catsforepaw

スコア5944

test CHANGED
@@ -32,6 +32,8 @@
32
32
 
33
33
  using System.Runtime.InteropServices;
34
34
 
35
+ using System.Windows.Interop;
36
+
35
37
  :
36
38
 
37
39
  :
@@ -43,6 +45,8 @@
43
45
 
44
46
 
45
47
  private DispatcherTimer dispatcherTimer = new DispatcherTimer();
48
+
49
+ private IntPtr hwndThis;
46
50
 
47
51
 
48
52
 
@@ -56,6 +60,14 @@
56
60
 
57
61
  dispatcherTimer.Start();
58
62
 
63
+
64
+
65
+ // Windowクラスのプロパティにウィンドウハンドルがないので取得して覚えておく
66
+
67
+ var hwndSource = HwndSource.FromVisual(this) as HwndSource;
68
+
69
+ hwndThis = hwndSource.Handle;
70
+
59
71
  }
60
72
 
61
73
 
@@ -65,6 +77,12 @@
65
77
  {
66
78
 
67
79
  IntPtr hwnd = GetForegroundWindow();
80
+
81
+ if(hwnd == hwndThis) // 自分自身への追従はしない
82
+
83
+ return;
84
+
85
+
68
86
 
69
87
  RECT rect = new RECT();
70
88
 
@@ -113,3 +131,13 @@
113
131
  補足
114
132
 
115
133
  位置だけ変えても別のウィンドウに隠れる可能性があるため、Windowの共通で`Topmost`にチェックを入れると(Topmost="True")常に見えるようになります。
134
+
135
+
136
+
137
+ ---
138
+
139
+ 追記
140
+
141
+ 自身がフォアグラウンドしたときにどこかに行ってしまわないようにサンプルコードを修正しました。参照するアセンブリに`System.Windows`を追加してください。
142
+
143
+

1

補足

2016/05/02 06:45

投稿

catsforepaw
catsforepaw

スコア5944

test CHANGED
@@ -107,3 +107,9 @@
107
107
  private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
108
108
 
109
109
  ```
110
+
111
+ ---
112
+
113
+ 補足
114
+
115
+ 位置だけ変えても別のウィンドウに隠れる可能性があるため、Windowの共通で`Topmost`にチェックを入れると(Topmost="True")常に見えるようになります。