おせわになります。
Zオーダーが上から2番目のウインドウのハンドル知る必要がありましたので、
GetWindowが使えるのではないかと思い、プログラムを作りましたがうまくいきませんでした。
次のようにしてみました。
Form1という名前の自作のフォームがメモ帳の上に重なっていたとします。
このとき、
Text1.Text = GetWindow(Form1.hwnd, GW_HWNDNEXT)
こようにしてもメモ帳のハンドルが得られませんでした。
Zオーダーが上から2番目のウインドウのハンドルを知る方法を教えて頂けないでしょうか。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
解決しているかもしれませんが、サンプルを作ってみたので
回答しておきます。
>Form1という名前の自作のフォームがメモ帳の上に重なっていたとします。
>このとき、
>Text1.Text = GetWindow(Form1.hwnd, GW_HWNDNEXT)
このイメージで、ボタンを押したら自分の下のウィンドウの
キャプションを表示します。(VB6.0のサンプルです。)
ウィンドウを選択する条件は、アプリによって変わってくる
と思いますので、見直してください。
Private Sub Command1_Click()
Dim lngReturnValue As Long
Dim strWindowTextBuffer As String * 516
Dim strWindowText As String
glngOwnerHwnd = GetWindow(Me.hwnd, GW_OWNER)
glngPrevHwnd = 0
gblnFound = False
Call EnumWindows(AddressOf EnumWindowsSubProc, 0)
If glngPrevHwnd <> 0 Then
lngReturnValue = GetWindowText(glngPrevHwnd, strWindowTextBuffer, Len(strWindowTextBuffer))
strWindowText = Left(strWindowTextBuffer, InStr(strWindowTextBuffer, vbNullChar) - 1)
MsgBox strWindowText
End If
End Sub
コールバックルーチンです。標準モジュールに記載してください。
Public glngOwnerHwnd As Long
Public glngPrevHwnd As Long
Public gblnFound As Boolean
'
' コールバック関数 - トップレベルウィンドウを列挙
'
Function EnumWindowsSubProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
If gblnFound = True Then
If (IsWindowVisible(hwnd) = WIN32API_TRUE) And _
(GetWindowTextLength(hwnd) > 0) And _
(GetWindow(hwnd, GW_OWNER) = 0) Then
glngPrevHwnd = GetLastActivePopup(hwnd)
EnumWindowsSubProc = WIN32API_FALSE
Else
EnumWindowsSubProc = WIN32API_TRUE
End If
Else
' ウィンドウハンドルを保存
If glngOwnerHwnd = hwnd Then
gblnFound = True
End If
' 戻り値をセット
EnumWindowsSubProc = WIN32API_TRUE
End If
End Function
APIの定義です。標準モジュールに記載してください。
' Win32API における、True、False
Public Const WIN32API_TRUE As Long = 1
Public Const WIN32API_FALSE As Long = 0
' トップレベルウィンドウを列挙する関数
Public Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
' ウィンドウのキャプションを取得する関数
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
' ウィンドウのキャプションの長さを取得する関数
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long
' ウィンドウが表示されているか調べる関数
Public Declare Function IsWindowVisible Lib "user32" _
(ByVal hwnd As Long) As Long
' 指定した関係のウィンドウハンドルを取得する関数
Public Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Public Const GW_OWNER = 4
' 最後にアクティブなポップアップウィンドウを調べる関数
Public Declare Function GetLastActivePopup Lib "user32" _
(ByVal hwndOwnder As Long) As Long
ありがとうございます。
> If (IsWindowVisible(hwnd) = WIN32API_TRUE) And _
> (GetWindowTextLength(hwnd) > 0) And _
> (GetWindow(hwnd, GW_OWNER) = 0) Then
> glngPrevHwnd = GetLastActivePopup(hwnd)
> EnumWindowsSubProc = WIN32API_FALSE
> Else
> EnumWindowsSubProc = WIN32API_TRUE
> End If
私の場合IsWindowVisible(hwnd)だけでふるい分けていたのですが、
上のようにしなければならなかったのですね。
勉強になりました。
どうもありがとうございました。
No.3
- 回答日時:
サンプルは、タスクマネージャのタスクに表示されるものしか
対象になってなせん。一部のウィンドウは、選択されない場合が
あります。
yamamoto99さんのやられたように、以下のようにvisibleだけの
チェックにして、visible以外にも、キャプションの有無、最小化
されているか、ウィンドウスタイル(ツールウィンドウなどかどうか)
などを、必要に応じてチェックを追加されるのがよいと思います。
If (IsWindowVisible(hwnd) = WIN32API_TRUE) Then
glngPrevHwnd = hwnd
EnumWindowsSubProc = WIN32API_FALSE
Else
EnumWindowsSubProc = WIN32API_TRUE
End If
度重なるアドバイスどうもありがとうございます。
> キャプションの有無、最小化されているか、
> ウィンドウスタイル(ツールウィンドウなどかどうか)
> などを、必要に応じてチェックを追加されるのがよいと思います。
なるほどそうですね。
最初、なぜ
GetWindow(hwnd, GW_OWNER) = 0
が必要なのか理解できずいろいろ調べていたら、VBのフォームがオーナーウインドウではないということがわかり驚きました。
ご親切にいろいろとどうもありがとうございました。
No.1
- 回答日時:
★簡単にアドバイス
・ウインドウの列挙は『EnumWindows』で行ってみましょう。
・この関数の方が、Zオーダーを正しく探せます。というよりも
トップレベル・ウィンドウのハンドルをリストアップ出来るため
子ウインドウのハンドルはカットしてくれます。使いやすいかな。
・列挙用のコールバック関数 EnumWindowsProc() は自作関数になります。
・この関数でウインドウを列挙して、2つ目が列挙されたら終了すれば
ちょうど、Zオーダーの上から2番目のウインドウのハンドルを取得
できます。
・EnumWindowsProc関数の引数 LPARAM に、ウインドウハンドルへの
ポインタを指定しておき、そこへ列挙されるウインドウハンドルを
セットしましょう。または、グローバル変数で用意したハンドルに
保存して返します。
・あと、EnumWindowsProc で自作フォームのウインドウハンドルの次を
取得したいのならば、列挙されるハンドルと Form1.hwnd を比較して
一致したら、次に列挙されるハンドルを返す工夫が必要です。
・以上。おわり。→私は、C/C++ なのでサンプルは紹介できません。
関連:
・http://www.winapi-database.com/Window/Change/Enu …
・http://www.winapi-database.com/Window/Change/Enu …
参考URL:http://www.winapi-database.com/Window/Change/
ありがとうございます。
> ・ウインドウの列挙は『EnumWindows』で行ってみましょう。
> ・この関数の方が、Zオーダーを正しく探せます。
そうだったんですか!!
EnumWindowsは以前使ったことがあったのですが、zオーダー順に返してくれるとは知りませんでした。
さっそく作ってみたところ、うまくいきました!!
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- カスタマイズ(車) トヨタ・ベルタ(KSP92)のホイールインチアップ後の走行安定性について 2 2023/01/09 11:27
- 飲食業・宿泊業・レジャー メモできないオーダーの覚え方 まず流れとして注文からレジまでの流れを大まかに説明します。わかりづらか 1 2023/02/13 00:06
- アルバイト・パート メモできないオーダーの覚え方 まず流れとして注文からレジまでの流れを大まかに説明します。わかりづらか 2 2023/02/13 00:09
- その他(自転車) よく高校生くらいの男の子が自転車のハンドルを握らずにスマホを操作しながら走ったり(スマホをいじってい 4 2022/10/07 14:02
- バイク免許・教習所 まだ教習通う前ですが、バイクに乗る上での注意点をまとめてみました。間違ってる箇所や、他の項目・アドバ 5 2022/04/27 19:44
- Mac OS Mac(venturaとmontery)間でmonteryのmacでメモのロックが開けなくなりました 2 2023/03/25 07:15
- その他(OS) Mac OSの操作について 2 2022/06/08 09:19
- 輸入車 左ハンドルや並行輸入車を買う人 11 2022/12/24 15:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
ラジオボタンの初期指定
-
WM_KEYDOWN が拾えない(EditBo...
-
ExcelVBAでAPIを使って外部ウイ...
-
[VBA] UserForm を Excel の W...
-
隠れたウィンドウの画面をキャ...
-
勝手にウィンドウが開いて止ま...
-
ダイアログをスクロールさせるには
-
Console.WriteLine で表示されない
-
MFC ダイアログ上のID取得につ...
-
他のアプリケーションの終了処理
-
「&HFFFF」「&H1A」とは?
-
他アプリの操作(メニューバー)
-
【VB2008】 マウス操作の一時的...
-
VBA .Value=.Value ?
-
EXCEL2016で新しいウィンドウを...
-
ダイアログ画面全体をマウスで...
-
子ウィンドウに発生したイベント
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
VBA .Value=.Value ?
-
ラジオボタンの初期指定
-
作成したウインドウのサイズを...
-
Vba LongPtrについて教えてくだ...
-
Excelの上下を固定したい
-
他のアプリケーションの終了処理
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
VBで外部プログラムを位置のみ...
-
ExcelのBOOKが消えた!
-
Alt+P,Alt+NをPostmessageで送...
-
UWSCで特定のChromeのタブをア...
-
Console.WriteLine で表示されない
-
MFC ダイアログ上のID取得につ...
-
最大化と最小化ボタン
おすすめ情報