• ベストアンサー

ShellExecuteでopenしたウィンドウのハンドルを取得

こんにちは ShellExecuteでopenしたウィンドウのハンドルを取得して、MoveWindowでサイズや位置を変更したいのですが、どうしてもハンドルが取れません。 どのような記述をすればよろしいか、ご存知の方はいらっしゃいませんでしょうか 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

ShellExecuteに限らず、子プロセスを起動した場合、初期化が成功すれば 制御が戻ります。それ以降に作成されるWindowのハンドルは単純には見つけ られません。 (1)Windowのクラスやタイトルバーテキストが分かっている場合 FindWindow、FindWindowExを使います。 http://msdn.microsoft.com/ja-jp/library/cc364634.aspx http://msdn.microsoft.com/ja-jp/library/cc410853.aspx (2)親ウィンドウを渡し、子Windowが1個しかないと分かっている場合 EnumChildWindowsを使います。 http://msdn.microsoft.com/ja-jp/library/cc410802.aspx (3)上記以外 CreateProcessかShell関数で、プロセスIDを取得します。 EnumWindowsでウィンドを順番に取得し、GetWindowThreadProcessIdで ウィンドウのプロセスIDを求めて一致するものを見つけます。 http://msdn.microsoft.com/ja-jp/library/cc429066.aspx http://msdn.microsoft.com/ja-jp/library/cc410851.aspx http://msdn.microsoft.com/ja-jp/library/cc364779.aspx

gogojets
質問者

お礼

返信遅くなりまして、申し訳在りません。 ウィンドウ名からハンドルを取得することができました。 本当にありがとうございました。 またの機会があれば、宜しくお願い致します。

関連するQ&A

  • ShellExecuteでハンドルを取得

    ShellExecuteで立ち上げたアプリケーションの ハンドルを取得取得できるのでしょうか? 返値はエラーなどでしたよね? はじめのShellExecute(ここ ,.....)の部分で いいのでしょうか? 宜しくお願いいたします。

  • ファイルオープンの際のウィンドウハンドルの取得方法

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 ShellExecute関数でファイルをオープンさせた際に、 開かれたファイルウィンドウのHWNDまたはCWndを 取得したいのですが、実現方法が分かりません。 ・やりたい事  複数ファイルをオープンさせて、各ファイルが閉じられた時に、  ファイル毎に任意の処理を行いたい。 マルチスレッドにて、CreateProcess→ファイルオープンを行い、 WaitForSingleObjectで、ファイルが閉じられるまで待機し、 コントロールが戻ってきたら、任意処理をするようにしていたのですが、 PowerPointファイルは複数ファイルを立ち上げても、 1プロセスにしかならないため、実装の変更を余儀なくされました。 CWnd->m_hWndで、各ファイルの区別が付けられるのではないかと 考え、現在、テスト用処理を組んでいるところです。 ファイルが閉じられたかどうかは、APIフックを用い、 DestroyWindowが呼ばれた際のHWNDを、自作プログラム側に送り、 ShellExecute時に取得しておいたHWND(またはCWnd)であれば、 任意処理へ移行。といった流れを考えています。 ShellExecute時に立ち上がったファイルのハンドルの 取得方法、または、全く別に、上記の目的を満たす 処理方法がありましたら、アドバイスお願いします。

  • ウインドウの取得

    かんたんYouTubeプレーヤーというソフトのウインドウハンドルを取得し、プレーヤーウインドウのサイズや位置を変更するプログラムをVB2008で作成しようとしました。このプレーヤーはリストウインドウとプレーヤーウインドウの二つがあるのですが、窓ちぇき!というソフトでタイトルとクラス名を調べたら二つとも同じタイトルとクラス名になっていました。これだとFindWindow関数でウインドウハンドルを取得できません。どうすればよいでしょうか。

  • VB.netでShellExecuteがしたい

    VB6ですと ShellExecute(Me.Handle, "open", "History.csv", "", "", 3) とするとエクセルが開いて「History.csv」が観覧できるのですが、VB.netだと、エラーがでないもののエクセル画面がでてきません。なぜでしょうか? また、ShellExecuteに変わるような関数がありますでしょうか? 以下はソースです、パスは間違っていないし、返り値は562954248388610となっています。 i = ShellExecute(Me.Handle.ToInt64, "open", sFolderPullPath & "SerialHistory.csv", "", "", 3)

  • ShellExecuteの使い方について

     既存のプログラム(他の人が作成したもの)を参考にプログラムを作成しましたが、どうしても、希望通りの挙動となりません。ShellExecuteの部分が要点と思いますので、その点について教えてください。言語は JavaScript です。  以下のような記述がありました。 ---- var launcher = new ActiveXObject("Shell.Application"); launcher.ShellExecute(cmd, param, "", "open", "1"); ----  ShellExecute の引き数の cmd は、実行ファイル名(ファイルパス付)、param は実行ファイルの引き数です。これはこれで動いています。  さて、これを参考に、cmd の部分にDOSコマンドを与えました。すると、DOSコマンドは実行されたものの、実行の瞬間に黒いウィンドウ(おそらく、コマンドプロンプトと思われます)が一瞬表示されました。この黒いウィンドウを表示させずにDOSコマンドを実行させたいのですが、引き数を調整することでそのようなことは可能でしょうか。  Webで調べたところ、ShellExecute の引き数として SW_SHOWNORMAL や SW_MAXIMIZE などを与える方法もあるようですが、SW_*** を紹介しているWebページでは、そもそも引き数の個数が上記と異なっていたりします。  ご助言をお願い致します。

  • ShellExecute で file://... をオープン

    VC++, MFC を使ってプログラムを書いています。 ShellExecute で file://C:/TEMP/foobar.exe?foo=bar をオープンすると、ちゃんと foobar.exe が起動されますが、クエリーの部分(foo=bar)の情報を取る方法がわかりません。 GetCommandLine で帰る文字列は foobar.exe までしかない。 GetEnvironmentStrings で帰る環境変数にも含まれない。 ? 以降の部分の文字列を取得する方法は無いのでしょうか?

  • window.openでリファラを取得するには

    a.html から、b.php に window.open でリンクを張っています。 その際、b.php で a.html から飛んできたというリファラを取得したいのですが、 window.open ではリファラを取得できないとどこかで見かけました。 b.php でリファラを取得するためには、 a.html でどのようにしてリファラを送ったらいいのでしょうか? target=_blank でもよいのですが、それだとウィンドウサイズの変更ができないため、 できる限りwindow.openを使いたいのです。 よい方法をご存知でしたら教えていただけないでしょうか?

  • 別ウインドウのハンドル取得の方法

    SDKで親ウィンドウを作ると同時に、OpenCVというコンピュータービジョンのライブラリを用いて、別のウィンドウを作りそこにある画像を表示させました。 このライブラリの関数を用いて作ったウィンドウの画像について、マウスの座標位置を取得したいのですが、この場合ウィンドウハンドルはどのように取得したらよいのでしょうか。

  • MoveWindowで位置だけ変更するには?

    VB.NET でウインドウの位置だけを変更するのに、次のMoveWindowsを使用しましたが、サイズも変更されました。   MoveWindow(hWnd, 0, 30, 0, 0, 1) ウインドウのサイズを変えないで、位置だけを変更する指定方法をご教示して頂きたくお願い致します。

  • ウィンドウハンドルの取得方法

    ダイアログの表示されないEXEを起動させて、FindWindowを使用してそのEXEのウィンドウハンドルを取得したいのですが上手くいきません・・。 FindWindowの第一引数は「ウィンドウのクラス名」を指定するようなのですが、「ウィンドウのクラス名」の意味が良くわかりません。第二引数は「ウィンドウ名」を指定するようなのですが、今回のようなアンダーグラウンドで動くEXEには「ウィンドウ名」は無いと思ってよいのでしょうか? ちなみにダイアログのあるEXEならウィンドウハンドルを取得できます。 お分かりの方がいらっしゃれば、ご教授願います。

専門家に質問してみよう