• 締切済み

ウインドウハンドルの数値

Test.exeは他のアプリケーションをキャプチャーするソフトです。 Test.exeはチャイルドウインドウとしてhStaticWndを持っています。 Test.exeの唯一のプロシージャでhSpecialWndを定義しました。それは、他のアプリケーションをキャプチャーしたウインドウが格納されているかもしれないし、Test.exeのチャイルドウインドウが格納されているかもしれない状況です。 hSpecialWndがhStaticWndであるかを調べる場合、 if (hSpecialWnd == hStaticWnd) でいいんですか? ウインドウハンドルは数値です。hSpecialWndが他のアプリケーションをキャプチャーしたウインドウだったとしても、hSpecialWndが、偶然にhStaticWndと同じ数字であることはありえませんか?

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> hSpecialWndが他のアプリケーションをキャプチャーしたウインドウだったとしても、 > hSpecialWndが、偶然にhStaticWndと同じ数字であることはありえませんか? ありえません。「ハンドル」というのは、そういうものです。 > hSpecialWndがhStaticWndであるかを調べる場合、 > if (hSpecialWnd == hStaticWnd) > でいいんですか? 良いと思うんですが、何かの間違いで、その子ウィンドウが居なくなっているとも限らないので、 hSpecialWnd に特別なメッセージを SendMessage() して、子ウィンドウの WndProc() で そのウィンドウならではの数値を返すようにしてあげる、というように私なら作ります。

yuyata
質問者

補足

偶然にhStaticWndと同じ数字であることはない という答えだけについてもあまり自信がないですか? 後半の説明のa-kumaさんの方法を詳しく教えて下さい。 ウィンドウならではの数値というのが分かりませんでした。 例えばcalc.exeのエディットボックスをキャプチャしたとして if (hSpecialWnd == hStaticWnd) を実行するなら、電卓が閉じられてcalc.exeのエディットボックスのウインドウハンドルが入っているhSpecialWndの値が無効かもしれないから何かをするんですよね?

関連するQ&A

  • 他アプリケーション’(ウィンドウ)のハンドル取得方法

     GetWindowTextを用いて、他ウィンドウ、他アプリケーション内のテキストボックスに表示されている、文字列を取得したいです。他アプリケーションは、自分のアプリケーションから、shell関数を用いて起動します。他ウィンドウのハンドル値は、shellの返り値でわかるのですが、テキストボックスのハンドル値が分かりません。 どなたか、 ご教授願います。 おねがいします。

  • 有効でないウインドウハンドルを指定したSendMessageは安全?で

    有効でないウインドウハンドルを指定したSendMessageは安全?では無いでしょうか?  あるサブスレッドの処理進捗状況を、あるサブウインドウに貼り付けた プログレスバー・コントロールに「現在~%」などと表示しています。 サブスレッド内からSendMessageでこのプログレスバーコントロールに 数値を送信しているのですが、 プログレスバーが貼りついているサブウインドウはユーザーが 閉じるボタンなどを押して任意に閉じたり開いたり出来るものに なっています。 それでもし「閉じる」でサブウインドウが破棄されたとき 当然その子ウインドウであるプログレスバーコントロールのハンドルも有効な ものでなくなっています。 このときスレッドで実行されるSendMessageは安全なものでは なくなっているのでしょうか? SendMessageを送る直前でif判定などでコントロールのハンドルが 有効かどうか調べるようにも考えたのですが 「調べて有効だと判断した直後」に破棄されて、それからSendMessageが実行される という場合も可能性としてあるなら、直前での判定は意味が無いことになります。 (現在はウインドウを閉じる時、破棄するのでは無くSW_HIDEなどとして、ただ隠すだけに しているのですがどうもスッキリした方法では無いなと思い。 本当にサブウインドウがいらない場合でも居座り続けるので。。) SendMessage命令自体が、仮に送信先が存在しない場合でも安全に終えてくれるという 前提があれば簡単で良いのですが、このような場合どのようにするべきでしょうか。

  • FinderSystem等のツールで取得できないハンドルを取得するには?

    他のアプリケーションのボタンで操作したいと思い FinderSystemやNuke++等のツールを使いウィンドウハンドルを調べ SendMessage関数を使ってコマンドボタンのクリックをする所までは できるのですが、ツール等でウィンドウハンドルを取得できないラベル トグルボタンが存在し、画面上では明らかに存在しているのですが そのボタンには反応せず、大きな枠組みでウィンドウハンドルを 取得してしまいます。FindWindow、FindWindowEx、GetWindow EnumChildWindowで子ウィンドウのハンドルまで調べたのですが 値が0になってしまいます。他にもボタンだけではなく タブコントロールも操作したいと思っているのですが 同様に子ウィンドウハンドルの値は0になってしまいます そもそもウィンドウハンドルを全て取得することは不可能なのでしょうか? いろいろな他のアプリケーションのコマンドボタンをFinderSystemで調べて 取得できる場合とできない場合があり、この差は何なのか 疑問に思っています。ご存知のお方がいれば お手数ですが教えていただけないでしょうか? 開発環境は、WindowsXP、VB6.0です。 宜しくお願いいたします。

  • HANDLEの宣言でのエラー

    現在C言語でプログラムを作成しています. シリアル通信を行うプログラムなのですが,エラーが出てしまい, ネットなどで検索してみたのですが,解決できませんでしたので,ご存知の方がいましたら,教えてください. エラーは以下のとおりです. [test.h] #ifndef INCLUDED_TEST_H #define INCLUDED_TEST_H HANDLE handle; HANDLE sirial(char ,char); void sirial_(HANDLE); #endif 上の用にヘッダファイルを作成し,グローバル変数の宣言・プロトタイプ宣言を行おうとすると型がHANDLEのところでエラーが出てしまいます. main関数と同じファイル内で宣言,定義した場合はエラーはでません. ヘッダファイルのように別ファイルに宣言するとエラーとなってしまうのです. 環境は Windows XP SP2 visual studio .net です. よろしくお願いします.

  • C++のクラス内で、ウインドウプロシージャなどの・・・

    Visual C++ 2008で、Windowsフォームアプリケーションを作っています。 .NET Frameworkでは実現できないウインドウを作るために、WindowsAPIに頼り始めたのですが これが分からないのでとても不便な状態なのですが WindowsAPIで使うための、ウインドウプロシージャや、ウインドウハンドルや、デバイスコンテキストハンドル・・・等を C++のクラスの中で、staticを付けずに普通のメンバとして組み込む事は、出来るのでしょうか? - - - - - - 今までは分からなかったので、とりあえずAPIに触れてみようと思いstaticをつけてどうにかやっていたのですが、それだとクラス内のインスタンスメンバにアクセスできないので、クラス内に作ってる意味がない感じになってしまいます。

  • 全角数値の判定

    教えて頂けますか? フォームからPOSTされた文字列が半角数値、または文字列の場合許可し、全角数値の場合拒否したいのですが 全角数値が is_numeric で数値として認識しない為 うまくいきません。 他に良い方法がありますか? よろしくおねがいします。 if ( strlen($_POST['test']) != mb_strlen($_POST['test'],'UTF-8') && is_numeric($_POST['test']) == TRUE ){ echo '半角で入力してください。<br />'; }

    • ベストアンサー
    • PHP
  • C++ 子ウィンドウのハンドルを取得したいのですが

    C++で別ウィンドウのアプリケーションを動かすというものを作っているのですが、そのウィンドウの子ウィンドウのハンドルを取得するのに困ったことがあるのでアドバイスをいただけると大変ありがたいです。 基本的にSPY++というソフトを使ってウィンドウ名その他を探し、FindWindowExまたはGetDlgItem関数を使って取得という方法をとっているのですが、クラス名、ウィンドウ名が全く同じもので、コントロールIDも0という状態のものがあり、片方を取得したい場合どうしたらよいのかという状態です。 知人にSPY++でみて上から何番目にあるやつと指定して得ることができる方法があるかもしれないと聞いたのですが、よくわかりません。 例としてその画像ものせますので、良い知恵がありましたらお貸しください。

  • アクティブウィンドウ(ドキュメントファイル)のパス

    VB初心者です。 VB等でアクティブウィンドウのパスを取得する方法を探しています。 タイトルであればGetWindowTextで取得で可能ですし、 アプリケーションのパスであれば、  http://sumishiro.blogspot.jp/2009/09/blog-post_30.htmlが参考になりました。  しかしドキュメントファイルのパスを取得する方法がどうしてもわかりません。 例えば、ワードでtest.docxを開いているとき、そのウィンドウハンドルからwinword.exeのフルパスでなく、test.docxのフルパスを取得する方法です。(ワード、エクセル等だけでなく画像ビューアーが画像ファイルを開いているとき、その画像ファイルのフルパスの取得) どうぞよろしくお願いいたします。

  • ウィンドウを終了させたい・・・

    いつもお世話になっています。 画面遷移時にあるメッセージウィンドウ(別exe)をVBから起動させ、遷移が終わった後にそのexeを終了させるプログラムを作っています。 プログラムの中身としては、 (1) Shell関数でexe(メッセージウィンドウ)を起動 (2) FindWindowで、起動しているexeのハンドルを取得 (3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 ・・・といったものです。 (1)と(2)はうまくいくのですが、最後のSendMessageがうまくいきません(>_<) 試しに(1)と(2)の後に、Do文の中で [1]SendMessageで起動したexeを終了させるようにする [2]FindWindowをして、ハンドルが0だったら、Exit Doする ・・・ようにプログラムしてみたところ、永久ループになってしまいました・・・。 他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ネットで調べていますが、他の方法が浮かびません。 どなたか、良い方法をご存じでしょうか?? よろしくお願いします!!

  • vb6です。 現在開いているフォームの次のウィンドウをアクティブにした

    vb6です。 現在開いているフォームの次のウィンドウをアクティブにしたいのです。 ただ、次のウィンドウはエクセルなど他のアプリケーションになります。 ハンドルとかはよくわからないのでハンドル以外の方法があればそちらを使いたいのですが、もしハンドルを取得するしかなければサンプルソースも教えてほしいです。 おねがいします。

専門家に質問してみよう