tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルタスクバーのGETITEMCOUNTが取れません。
記事No10478
投稿日: 2011/03/30(Wed) 15:18
投稿者camputer
 今日は、いつも勉強させていただいております。
質問させていただきます。どうぞよろしくお願いいたします。

 環境:VB2008EE + XP
 VB歴3年程度&プログラム歴10年程度 でございます。

 現在開いているテキストファイル名の一覧を作成いたしたく
「タスクバー上のボタン名一覧を取得すればよいのかな」などと考えまして
検索いたしておりましたところ、↓の頁で同じ質問をなさっておられました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24958&forum=7

 そこで同じようにコーティングさせていただきましたところ、タスクバーの
hwndは取れるのでございますが、SendMessageしたつもりのTCM_GETITEMCOUNTが
0しか返ってまいりません。コードは下記のようになります。

    Public Const TCM_FIRST As Integer = &H1300
    Public Const TCM_GETITEMCOUNT As Integer = TCM_FIRST + 4

    Dim iTabCount As Integer = 0 'ボタンの数

    'ボタンの数取得
    Dim hwnd As Integer = FindWindow("Shell_TrayWnd", "")
        MsgBox(hwnd)
        iTabCount = SendMessage(hwnd, TCM_GETITEMCOUNT, 0, 0)
        MsgBox(iTabCount)






 SendMessageにつきましては、頁下部にある2つの宣言方法(下記1と2)では
エラー「縮小変換しないで呼び出される、アクセス可能な'SendMessage'がないため、
オーバーロードの解決に失敗しました。」が出ますが、
頁中程にあるlParamがObjec型の物(下記3)であればエラーが消えます。
SendMessageがおかしいのかな?などと考えまして、もう1つSendMessageを
見つけてまいりましたが(下記4)、やはりボタンの数は0でございます。

'1
    <DllImport("user32.dll")> _
    Public Shared Function SendMessage( _
    ByVal hWnd As IntPtr, _
    ByVal msg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As IntPtr) As Boolean

    End Function
'2
    <DllImport("user32.dll")> _
    Public Shared Function SendMessage( _
    ByVal hWnd As IntPtr, _
    ByVal msg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Integer) As Integer

    End Function
'3
    <DllImport("user32.dll")> _
    Public Shared Function SendMessage( _
    ByVal hWnd As Integer, _
    ByVal MSG As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Object) As Integer

    End Function
'4
    Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Integer,  _
    ByVal MSG As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Object) As Integer


 どこか見落としや間違っていそうな箇所・ヒントなどございましたら
お教えいただけないでしょうか。
 どうぞよろしくお願いいたします。

[ツリー表示へ]
タイトルRe: タスクバーのGETITEMCOUNTが取れません。
記事No10479
投稿日: 2011/03/30(Wed) 18:13
投稿者魔界の仮面弁士
>  そこで同じようにコーティングさせていただきましたところ、タスクバーの
> hwndは取れるのでございますが、SendMessageしたつもりのTCM_GETITEMCOUNTが
> 0しか返ってまいりません。コードは下記のようになります。

TCM_GETITEMCOUNT は、タブコントロールに対して使う物です。

'Private Declare Auto Function FindWindow Lib "user32" (ByVal className As String, ByVal windowName As String) As IntPtr
Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As IntPtr, ByVal msg As Integer, ByVal wparam As IntPtr, ByVal lparam As IntPtr) As Integer

MsgBox(Me.TabControl1.TabCount)
hwnd = Me.TabControl1.Handle
iTabCount = SendMessage(hwnd, TCM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero)
MsgBox(iTabCount)


そして XP のタスクバーはタブコントロールではありません(ツールバーです)。

一応、Shell_TrayWnd の下位ウィンドウに対して TB_BUTTONCOUNT を
発行するという手はありますが、タスクバーの内容を調べたところで
> 現在開いているテキストファイル名の一覧を作成いたしたく
という目的は達成できないかと思いますよ。

[ツリー表示へ]
タイトルRe^2: タスクバーのGETITEMCOUNTが取れません。
記事No10480
投稿日: 2011/03/30(Wed) 19:31
投稿者camputer
魔界の仮面弁士様
どうもありがとうございます!!

本当にいつも、誠にありがとうございます。m(_ _)m

>TCM_GETITEMCOUNT は、タブコントロールに対して使う物です
どうもありがとうございます。
リンク先で質問なさっている方はWin2000+VB2003でこのような方法で
>ボタン数などは正しく取得できるのですが
と書いていらっしゃいますので、OSによって違う、という事でございましょうか?
(もしそうでしたら、魔界の仮面弁士様はOSによるタスクバーの
種類の違いまでご存知、という事に。。^^?)

 目的はVista,Win7でも大丈夫でございます。(もうそろそろ私も周りも
XPパソコンは使わなくなりますし。。^^)
先程はXPパソコン上で動作確認いたしておりましたため、
動作環境をXPと明記させていただきました。
 今アドバイスをいただいてからVista上で動作確認いたしましたが、
こちらも同様に0が帰ってまいりました。(Hwndは数字が入っております。)


 Vista以降のOSで、何か可能性のある方法などございますでしょうか?
この方法を試す前は、
http://bbs.wankuma.com/index.cgi?mode=al2&namber=32597&KLOG=57
の中段程にございますコード(魔界の仮面弁士様のコードでございます)で、
タスクバーのボタン名が取れましたので、これで一覧を作成できないか
考えておりました。
# 左端から100個程度の座標を指定してボタン名を見ていけば
# 一覧が作れるかな?などと。。^^;しかしこの方法ですと、
# 同じ名前のファイルがあった場合などに、バグが出そうなので一旦諦めました。。
#  しかしこのコードは色んなソフトのコントロール名が全部出てくるので
# 面白かったです^^ 特に自分の作成したコントロールに
# 変な名前が付いていたのも発見できましたし。。^^;

 もし他の方法が見つからなそうでございましたら、
上記の魔界の仮面弁士様のコードを使わせていただく方法で再トライいたします。

 この度はご親切にアドバイスいただきまして誠にありがとうございました!!!m(_ _)m

[ツリー表示へ]
タイトルRe^3: タスクバーのGETITEMCOUNTが取れません。
記事No10481
投稿日: 2011/03/30(Wed) 20:01
投稿者camputer
(追記になります。)

 今回出来るようになりたい事はタスクバーのボタン名を一覧にする事
でございまして、ボタン数すら取れない今の私のコードではそれ以前の
話だと考え、質問させていただいた次第でございます。
(最初のリンク
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24958&forum=7
で同じことをなさろうと苦戦している方が、ボタン数は簡単に取って
おられましたので、こんな状態で「ボタン名をリスト化したいです」などと
ここに質問させていただいても丸投げですし、まず同じようにボタン数を
取れる状態から自分で試してみたかった次第でございます。

しかし
>TCM_GETITEMCOUNT は、タブコントロールに対して使う物です
という事は、どうも「ボタン数を取る」事は今回の目的に役に立つか
どうか怪しくなってきてまいりましたので、決して「ボタン数を取得する」
事に固執いたしません。
 
 リンク先を閲覧する限りかなり面倒な問題のようでもございますし、
本質問「タスクバーのGETITEMCOUNT」につきましてはとりあえず
魔界の仮面弁士様からいただけたご指摘でほぼクリアになりましたので
解決とさせていただき、改めて目的の質問をさせていただきます。

 ご閲覧&考えてくださった方々、誠にありがとうございました。m(_ _)m

[ツリー表示へ]
タイトルRe^3: タスクバーのGETITEMCOUNTが取れません。
記事No10482
投稿日: 2011/03/30(Wed) 20:17
投稿者魔界の仮面弁士
> と書いていらっしゃいますので、OSによって違う、という事でございましょうか?
Windows 2000 まではタブコントロールでした。

ご存知のように Vista では大幅に変更されていますし、7 ではさらに変更されています。
http://msdn.microsoft.com/ja-jp/magazine/dd942846.aspx
http://msdn.microsoft.com/ja-jp/windows/dd630680


> OSによるタスクバーの種類の違い
ある程度までは、Visual Studio 等に同梱されている SPY++ (spyxx.exe)を使って
調査することができます。


>> 現在開いているテキストファイル名の一覧を作成いたしたく
>> 「タスクバー上のボタン名一覧を取得すればよいのかな」などと考えまして
まず、ファイル名がタスクバーボタンに表示されているとは限りません。
次に、タスクバーに表示されているからといって、ファイルが開かれているとは限りません。

たとえばメモ帳の場合、ファイルが開かれるのは読み込み時と書き込み時の一瞬だけです。
文章が表示されてユーザーが編集可能な状態では、既にファイルは閉じられています。

さらに言えば、ITaskbarList インターフェイスを使うと、タスクバーへの
表示/非表示を任意に切り替えられます。なので、タスクバーのボタン一覧を取得しても
それがテキストファイル名の一覧を取得する方法にはなりえないはずです。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=47870&KLOG=81


ファイル操作を監視するだけなら、Process Monitor や FileMon を使うという手もあります。
http://technet.microsoft.com/ja-jp/sysinternals/bb896645
http://technet.microsoft.com/ja-jp/sysinternals/bb896642
http://d.hatena.ne.jp/wwwcfe/20100416/processmonitor

[ツリー表示へ]
タイトルRe^4: タスクバーのGETITEMCOUNTが取れません。
記事No10484
投稿日: 2011/03/30(Wed) 21:12
投稿者camputer
 どうもありがとうございます!!!
> Windows 2000 まではタブコントロールでした。
 なるほど、それで今回の現象が納得いきました。
今回質問&お教えいただかなければ、ずっとトライしてしまう
ところでございました^^;

> ご存知のように Vista では大幅に変更されていますし、7 ではさらに変更されています。

 はい、特にWin7ではグループ化の切り替えもございますので尚更、困難だろうと
考えておりましたが、下にご紹介いただけたようなソフトを見つける事が
できず、消去法でこの方法を選択いたしました次第でございます^^;

> > OSによるタスクバーの種類の違い
> ある程度までは、Visual Studio 等に同梱されている SPY++ (spyxx.exe)を使って
> 調査することができます。

 はい、数年前にVBAから他のアプリケーションを動かせると知り、SPYなるものを
どこからかDLいたしまして、初めてSendMessageして激しく感動いたしました
記憶がございます^^ その時はSPYが意味不明でしたが、
もう一度正式版を入手して遊ぶ癖をつけておきます。

> たとえばメモ帳の場合、ファイルが開かれるのは読み込み時と書き込み時の一瞬だけです。
> 文章が表示されてユーザーが編集可能な状態では、既にファイルは閉じられています。

 もしかしたらテキストファイルがメモ帳で「開かれている」状態なのに
上書き等ができてしまう現象は、そういう理屈だったのでございましょうか。
なるほど。。。初めて知りました。
 となりますと、尚更プロセスを把握する方法やツールをおさえる必要がございますね。

> ファイル操作を監視するだけなら、Process Monitor や FileMon を使うという手もあります。
> http://technet.microsoft.com/ja-jp/sysinternals/bb896645
> http://technet.microsoft.com/ja-jp/sysinternals/bb896642
> http://d.hatena.ne.jp/wwwcfe/20100416/processmonitor

 どうもありがとうございます!!今簡単に説明を読ませていただきました。
(あまり理解できておりませんが。。^^;)
これで何が出来るのかを今から色々とテストしてみます。
こういった「プロセス」関係のソフトと聞きますと、初めて他のソフトを
VBで動かした時のような、ワクワク感が蘇ってまいります^^

 またこの件で考察してから行き詰ったらどうぞよろしくお願いいたします!
 この度はお忙しい中、ご親切に誠にありがとうございました!!m(_ _)m

[ツリー表示へ]
タイトルRe: タスクバーのGETITEMCOUNTが取れません。
記事No10483
投稿日: 2011/03/30(Wed) 20:52
投稿者花ちゃん
>  現在開いているテキストファイル名の一覧を作成いたしたく

ちょっと試しに作ってみました。
VB2010 / Windows 7 ですが、OS に左右されないかと
Word (複数のTXT ファイルを読み込み表示) /メモ帳 /ワードパッド で表示して確認


サンプル投稿用掲示板の方に修正して投稿しておきましたのでこちらは削除します。

 現在開いているテキストファイル名の一覧を取得(VB.NET)
 http://www.hanatyan.sakura.ne.jp/patio/read.cgi?no=300

[ツリー表示へ]
タイトルRe^2: タスクバーのGETITEMCOUNTが取れません。
記事No10485
投稿日: 2011/03/30(Wed) 21:20
投稿者camputer
 どうもありがとうございます!!!!!!!!!!! m(_ _)m

> ちょっと試しに作ってみました。
 今からすぐに試してまいります!再度ご報告いたします!

 とりあえずお礼だけ先にさせていただきます。
試すのに時間がかかるとレスが遅くなるのが嫌ですので。。。
 お忙しい中、誠にありがとうございますm(_ _)m

[ツリー表示へ]
タイトルRe^3: タスクバーのGETITEMCOUNTが取れません。
記事No10486
投稿日: 2011/03/30(Wed) 23:19
投稿者camputer
 花ちゃん様

 大成功でございます^^ m(_ _)m誠にありがとうございます。
わずか30行で一体どのようなコーディングをなされたのかと思いましたが、
EnumChildWindowsで列挙するんですねー。。見たことはございましたが
きちんと理解しておりませんでした。といいますかVBAにも
あるのでございますね、これ。初めて知りました。

 小一時間ほどVB2008EE+Vistaで動かさせていただきましたが、
綺麗に、欲しい情報が出てきてくれます^^
 試しに「.txt」で限定せずにすべてPrintいたしてみましたが
かなり沢山の物が出てまいりましたので、「隅から隅まで」
EnumChildWindowsしているような感じでございましょうか。
まだきちんと理解できておりませんので、もっと動作を試させていただきます。

>ちょっと試しに作ってみました
 ^^; ちょっとや試しでこんなモノが作れるのが羨ましいです。。
努力して手に入れるスキルですから「羨ましい」という表現は
適切ではないような気もしますが。。
 ただこんなモノを思いつく度に、もし自分がこんな短時間で実現できるように
なりましたら、おそらく1日中プログラムを作って遊ぶんじゃないかな
と思います^^;

 お陰でまた、この2週間検索していたものが解決いたしました。
自分の作成したコードが1文字も使われずに解決してしまい、弱冠(略。
 ネット上にあるコードを切り貼りして継ぎ足していくレベルを早く
脱せるよう頑張ります。

 今回お教えいただいたコードをメインに続きを考えてまいります!
この度はお忙しい中、ご閲覧・アドバイス・コーディングまでいただきまして
誠にありがとうございました!!!!m(_ _)m

[ツリー表示へ]