|
>そういう手段もあったらいいということで、ご意見参考にさせていただきます。
例えば、
let hmWndList = hidemaru.getWindowHandleList();
で、
[ 1番目のウィンドウハンドル, [2番目, 3番目, 4番目], 5番目, 6番目, [7番目, 8番目], 9番目]
みたいなのが返ってきて、
・全体の順番はウィンドウズからみたレイヤーの順
・「要素自体」がリスト(上の例なら2,3,4番目)は、タブになってる
みたいなのでも有りだと思います。
(今のjsは 配列オブジェクトにはflat()みたいな関数もあるので、ネストを平らするうのも楽ですし)
// -------------------------------------------
現在は重量級のもの、
一度実行してしまうと、非同期[jsではなく本当の非同期] であるとはいえ、秒といった時間がかかるものに対しては
以下みたいに形で間引き判定しています。
```
IsCurrentWindowAbove()
```
これと似たようなことを 「jsmode 層だけで完結するような処理の場合」
に手軽にできればよいという感じです。
// Hm.WindowHandleのクラス名。ストア版とデスクトップ版で異なため、それを考慮してキャッシュする。
string curHmWndClassNameCache = null;
// 指定されたウィンドウのクラス名を取得する関数
private string GetWindowClass(IntPtr hWnd)
{
StringBuilder className = new StringBuilder(256);
int result = GetClassName(hWnd, className, className.Capacity);
if (result > 0)
{
return className.ToString();
}
return null;
}
// 親ウィンドウをたどり、同じクラス名のウィンドウがあるか判定する関数
public bool HasSameClassParent(IntPtr hWnd)
{
IntPtr parentHWnd = GetParent(hWnd);
while (parentHWnd != IntPtr.Zero)
{
string parentClassName = GetWindowClass(parentHWnd);
if (parentClassName == curHmWndClassNameCache)
{
return true; // 同じクラス名の親ウィンドウが見つかった
}
parentHWnd = GetParent(parentHWnd);
}
return false; // 同じクラス名の親ウィンドウは見つからなかった
}
// 他のウィンドウより上方にある(1つに絞るわけではなく、jsmodeやネイティブやC#などプログラム実行継続の対象となるウィンドウという意味)
private bool IsCurrentWindowAbove()
{
IntPtr curHWnd = Hm.WindowHandle;
// 自身のウィンドウハンドルのクラス名のキャッシュがない
if (curHmWndClassNameCache == null)
{
curHmWndClassNameCache = GetWindowClass(curHWnd);
}
// タブモードである
if (HasSameClassParent(curHWnd) )
{
int currentWindowBackGround = Hm.Edit.InputStates & 0x00000800;
// 非アクティブではない(=自分のプロセスはアクティブである)
if (currentWindowBackGround == 0)
{
return true;
}
}
// 非タブモードなら
else
{
if (curHmWndClassNameCache?.Length > 0)
{
// そのクラス名で検索。(非タブモードならデスクトップ直下のルートウィンドウとして秀丸ウィンドが存在する)
IntPtr firstFindWnd = FindWindow(curHmWndClassNameCache, IntPtr.Zero);
// 自分が秀丸の中で一番手のウィンドウである
if (firstFindWnd == curHWnd)
{
return true; ;
}
else
{
IntPtr secondFindWnd = FindWindowEx(IntPtr.Zero, firstFindWnd, curHmWndClassNameCache, IntPtr.Zero);
// 自分が秀丸の中で2番手のウィンドウである
if (secondFindWnd == curHWnd)
{
return true; ;
}
}
}
}
return false;
}
|
|