HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0527
rynタスクバーに表示されているタスクのウインドウハンドルを順番に取得。6未解決


ryn

リンク

2010/5/27(Thu) 00:12:57|NO.32771

タスクバーに表示されているタスクのウインドウハンドルを順番に取得しようと思い、
1.FindWindowEx()でタスクバーのハンドルを取得。
2.GetWindowThreadProcessId()でプロセスIDを取得。
3.OpenProcess()でプロセスハンドルを取得。
4.VirtualAllocEx()でメモリ確保。
5.SendMessage()でタスクボタンの数を取得。(TB_BUTTONCOUNT)
6.SendMessage()でタスクボタンの文字列を取得。(TB_GETBUTTONTEXT)
7.ReadProcessMemory()で読み込む。
とし、
実行すると、
--
Notepad
無題 - メモ帳
Windows Calculator
電卓
--
と表示してくれる段階まで来たのですが、
肝心のウインドウハンドルを取得する方法が分かりません。
FindWindow()が使えるのではないかと思ったのですが、
同じプロセスが複数ある場合、
--
Notepad
無題 - メモ帳
Windows Calculator
電卓
無題 - メモ帳
Windows Command Processor
C:\WINDOWS\system32\cmd.exe
--
の様に2つずつ表示されなくなってしまい、
私の力ではFindWindow()を使用することが出来ません。

また、上記の方法ではなく、EnumWindow()でウインドウハンドルを取得することも考えたのですが、
これは、タスクバーの順番ではなく、Zオーダーのようです。

何方か、タスクバーのタスクのウインドウハンドルを順番に取得する方法をご教授お願いします。



この記事に返信する


miso

リンク

2010/5/30(Sun) 14:07:12|NO.32835

指定した値以降のウィンドウハンドルを検索・・・みたいなことができたようなそうでもないような。
なんて言えばいいのかわかりませんが。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18667&forum=7
この辺参考になりませんか?



テック

リンク

2010/5/31(Mon) 01:14:33|NO.32855

まだできた訳ではありませんが、
途中まで調べたことについて記載しようと思います。

>何方か、タスクバーのタスクのウインドウハンドルを
>順番に取得する方法をご教授お願いします
まず「タスクバーのウィンドウハンドルの取得方法」について調べましたら
↓のWEBサイトページがありました。
(http://homepage2.nifty.com/DSS/PT/HTML/Win/TaskTray/TaskTrayHandle.htm)

しかし上記の方法で試したんですが、上手くいかなくて
もっと調べましたら、Visual Stduioに付属しているツール「Spy++」
を用いてクラス名を調べているサイトがありましたので
(http://bbs.wankuma.com/index.cgi?mode=al2&namber=8391&KLOG=8)
(↑C#とVBの質問板ですが・・・^^;)
Spy++で調べてみると、タスクバーの親子関係の箇所で
「ToolbarWindow32」というクラス名があったので
ググったら↓のWEBサイトページがありました。
(http://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html)
上記のWEBサイトには、タスクバーの歴史やタスクバーの親子関係、
タスクバーのどこの部分が、どういうクラス名なのかも
詳しく記載してあるので参考にしてみるといいかもしれません。

>指定した値以降のウィンドウハンドルを検索・・・みたいなことができたようなそうでもないような。
>なんて言えばいいのかわかりませんが。
misoさんの記載どおりにFindWindowEx命令で
NULLが戻ってくるまでループするようなスクリプトを作成したのですが、
なんか指定したクラス名に該当するウィンドウハンドルを
一括でしているような気がします。
この問題については、継続して調べていこうと思います。

↓に確認用に作成したスクリプトを載せておきます。

// 外部DLLを指定する #uselib "user32.dll" // 外部DLL呼び出し関数を登録する #cfunc global GetDesktopWindow "GetDesktopWindow" #cfunc global FindWindow "FindWindowA" var, var #cfunc global FindWindowEx "FindWindowExA" int, int, var, var #cfunc global GetWindowText "GetWindowTextA" int, str, int // 定数の宣言 #const NULL 0 // グローバル変数宣言 g_hDesktop = NULL g_hWndTaskBar = NULL g_hWndTaskTray = NULL g_hWndReBar = NULL g_hWndMsTask = NULL g_hWndToolBar = NULL g_nCount = NULL g_nResult = NULL g_strTaskBar = "Shell_TrayWnd" g_strTaskTray = "TrayNotifyWnd" g_strReBar = "ReBarWindow32" g_strMsTask = "MSTaskSwWClass" g_strToolBar = "ToolbarWindow32" g_strNull = NULL g_strText = "" dim g_hWndList, 128 // HSPエントリーポインタ *HspMain // デスクトップのウィンドウハンドルを取得する g_hDesktop = GetDesktopWindow() mes "デスクトップ:" + g_hDesktop // タスクバーのウィンドウハンドルを取得する g_hWndTaskBar = FindWindow(g_strTaskBar, g_strNull) mes "タスクバー:" + g_hWndTaskBar // タスクトレイのウィンドウハンドルを取得する g_hWndTaskTray = FindWindowEx(g_hWndTaskBar, NULL, g_strTaskTray, g_strNull) mes "タスクトレイ:" + g_hWndTaskTray // リバーコントロール(ReBarWindow32)のウィンドウハンドルを取得する g_hWndReBar = FindWindowEx(g_hWndTaskBar, NULL, g_strReBar, g_strNull) mes "リバーコントロール:" + g_hWndReBar // マイクロソフトタスク(MSTaskSwWClass)のウィンドウハンドルを取得する g_hWndMsTask = FindWindowEx(g_hWndReBar, NULL, g_strMsTask, g_strNull) mes "マイクロソフトタスク:" + g_hWndMsTask // ツールバーのウィンドウハンドルを取得する g_hWndToolBar = FindWindowEx(g_hWndMsTask, NULL, g_strToolBar, g_strNull) mes "ツールバー:" + g_hWndToolBar // ウィンドウのタイトルを取得する g_nResult = GetWindowText(g_hWndToolBar, g_strText, 1024) // ウィンドウのタイトルを取得できた場合 if(g_nResult >= 1) { mes "ウィンドウのタイトル:" + g_strText // ウィンドウのタイトルを取得できなかった場合 } else { mes "ウィンドウのタイトルを取得できませんでした" } // 該当するウィンドウが無くなるまでループする do // ウィンドウハンドルを列挙する g_hWndList.g_nWindowCount = FindWindowEx(g_hDesktop, g_hWndList(g_nCount), g_strToolBar, g_strNull) mes "ウィンドウリスト" + g_nCount + ":" + g_hWndList(g_nCount) // ウィンドウカウントをカウントアップする g_nCount = g_nCount + 1 until g_hWndList(g_nCount - 1) != NULL stop



kweb(xor)

リンク

2010/5/31(Mon) 02:39:47|NO.32858

余談かもしれないですが、64bit版では取得できてないみたいです。



ryn

リンク

2010/5/31(Mon) 16:14:15|NO.32867

回答有難うございます。
XP SP3 32bit環境にて、テック様のサンプルを実行したところ、
MSTaskSwWClassとToolbarWindow32が正常に取得できない為、
正常に動作しませんでした。
もう少し調べたいと思います。



thanbo

リンク

2010/6/1(Tue) 01:31:22|NO.32873

なんですか?エントリーポインタって。HSPにそんなものはありませんよ。



thanbo

リンク

2010/6/1(Tue) 01:32:05|NO.32874

なんですか?エントリーポインタって。HSPにそんなものはありませんよ。



ONION software Copyright 1997-2023(c) All rights reserved.