• ベストアンサー
  • すぐに回答を!

任意のIEにリンクを指定したいです

2つのIEが起動しており、そのうち指定するIEの方にリンク先を上書きする方法をご教授頂ければと思います。 環境はVisual C++ 2005 Express Editionのwin32コンソールで作成しています。 IEを起動する方法として、FindWindow関数で上書きしたいIEのウィンドウ名のハンドルを取得し、ShellExecute関数でそのハンドルにリンク先を指定する方法を取っています。 下記は作成したプログラムです。 確かに指定したウィンドウ名を参照し、hWndにNULL以外の値が入っておるのですが、URLを上書きするウィンドウが指定したウィンドウではなく、最後に起動したIEのウィンドウに表示されてしまいます・・・。 説明べたなので例を示します・・・。以下のような動作になります。 (1)作成したプログラムからIEを起動する。ウィンドウ名:test - Windows Internet Explorer (2)デスクトップから新規にIEを起動する。ウィンドウ名:yahoo - Windows Internet Explorer (3)もう一度作成したプログラムからIEを起動すると、(2)で起動したIEに上書きしてしまう。本当は(1)に上書きしたいのに・・・。 また、ShellExecuteの第一引数はそのハンドルを持つウィンドウを差していると認識しているのですが、違いますでしょうか? /////////////////////////////////////////////////// HWND hWnd = FindWindow( NULL, "ウィンドウ名") ); if ( hWnd != NULL ) {   ShellExecute( hWnd, "Open", URL, NULL, NULL, SW_SHOW ); } else {   ShellExecute( NULL, "Open", "IExplore",​ URL, NULL, SW_SHOW ); } ///////////////////////////////////////////////////

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数614
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2
  • redfox63
  • ベストアンサー率71% (1325/1856)

使うインターフェースは IShellWindows, ISHellBrowser, IWebBrowserの3つでよさそうです Windows.h shlObj.h locale.hをインクルードします ライブラリは ole32.lib oleaut32.libを追加します   IShellWindows* pSW = NULL;   IShellBrowser* pSB = NULL;   IWebBrowser* pWB = NULL;   VARIANT vIndex;   long n, nCnt;   BSTR locName;   HRESULT hr;   // バリアント型は初期化が必要   VariantInit( &vIndex );   // long型の指定   vIndex.vt = VT_I4;   // printfの文字化け対策   _tsetlocale( LC_ALL, _T("Japanese") );   // COMを使用するのでライブラリを初期化   OleInitialize( NULL );   // IShellWindowsを実体化する   hr = CoCreateInstance( CLSID_ShellWindows, NULL,     CLSCTX_SERVER, IID_IShellWindows, (LPVOID*)&pSW );   if ( hr == S_OK ) {     // 起動中のブラウザの数を取得     pSW->get_Count( &nCnt );     for( n=0; n < nCnt; n++ ) {       // 取得するブラウザのインデックスを設定       vIndex.lVal = n;       // IShellBrowserを取得       hr = pSW->Item( vIndex, (IDispatch**)pSB );       if ( hr == S_OK ) {         // IWebBrowserを取得 … ここが自信無し         hr = pSB->QueryInterface( IID_IWebBrowser,                         (void**)&pWB );         if ( hr == S_OK ) {           // LocationNameを取得           pWB->get_LocationName( &locName );           _tprintf( _T("%s\n"), locName );           // BSTRの後始末           SysFreeString( locName );           // 用済みインターフェースの後始末           pWB->Releace();         }         // 用済みインターフェースの後始末         pSB->Releace();       }     }     // 用済みインターフェースの後始末     pSW->Releace();   } といった具合です HWNDで比較するならIShellBrowserのGetWindowで取得可能です HWND* phWnd = NULL; pSB->GetWindow( phWnd );

共感・感謝の気持ちを伝えよう!

質問者からのお礼

連絡が遅くなり、大変申し訳御座いませんでした。。。 御記述頂いたソースを参考に修正しまして、なんとか上書き起動しないようにすることができました! 但し、まだCOMクラスの理解が中途半端なので学習し直しております。 御教授頂きまして有難う御座いました。

関連するQ&A

  • 別アプリ終了させる

    いつもお世話になります。 再度質問ですが、 A.EXEとB.EXEがあり、B.EXEはA.EXEからShellExecuteで起動させています。 起動したB.EXEからA.EXEを終了させたいのですが、それにはA.EXEの ウィンドウハンドルが必要になると思います。 このときにA.EXEのタイトルは動的に変更されるので、FindWindowは使えません。 そこでA.EXEからB.EXEを起動した時にhWNDを送ってやれば、B.EXEからA.EXEを 操作できるとおもいます。 hWNDを対象アプリに送りたいのですが、ShellExecuteやCreateProcessのパラメータにhWndを持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。

  • VC++からブラウザを起動して・・・

    VC++&MFCで画面を作成しています。 作成した画面のあるボタンをクリックすると、規定のブラウザが起動され、 指定したURLを表示にいくという処理を行いたいので、 ShellExecute( NULL, "open", "http://xxx.xxx.co.jp/", NULL, NULL, SW_SHOWNORMAL ); という様な感じでブラウザを起動しているのですが、このブラウザの起動時に、 アドレスバー・ツールバー等を非表示にしたいのです。 ShellExecute()じゃなくても良いので、VC++(SDK、MFC何でも可)で 実現する方法はあるのでしょうか?。 よろしくお願いします。

  • Acrobat Readerのショートカットが起動できません

    スタートメニュー内のショートカットを起動するアプリを作っているのですが「Acrobat Reader」と「MSN Messenger 6.1」のショートカットだけ起動してくれません。 他のアプリは起動できます。 起動はShellExecuteを使っています。 ShellExecute(m_hWnd, "open", "C:\\Documents and Settings\\All Users\\スタート メニュー\\プログラム\\Adobe Reader 6.0.lnk", NULL, NULL, SW_SHOW); ShellExecuteの戻り値は以下のようになっています。 SE_ERR_ACCESSDENIED : 「オペレーティングシステムが、指定されたファイルへのアクセスを拒否しました。」 エクスプローラでショートカットのプロパティを開いてみると、うまくいかないショートカットは他のショートカットのようにEXEファイルにリンクしているのではなく、何か別のものにリンクしているようです。 このタイプのショートカットの起動の方法を教えてください。 よろしくお願いします。

その他の回答 (1)

  • 回答No.1
  • redfox63
  • ベストアンサー率71% (1325/1856)

すみません m(__)m どうも ShellExecuteのhWndにFindWindowで探したウィンドウハンドルを渡してもダメなようですね 当方でも同じ症状でした 本格的にCから制御するならCOMクラスで制御しないといけないようです COM(Component Object model)については明るくないので … GetActiveObjectやCoCreateInstanceなどをを使うようですけど VB系でしたら dim oShell as Shell Dim oShellWindows as ShellWindows Dim oBrowser as InternetExplorer dim n as Integer Set oShell = new Shell Set oShellWindows = oShell.Windows for n = 0 to oShellWindows.Count -1 Set oBrowser = oShellWindows(n)   if oBrowser.LocationName = "タイトル" then     oBrowser.LocationURL = "設定したいURL"     Exit Sub   end if next といった具合です 参照設定として『Microsoft Shell Controls and Automation』『Microsoft Internet Controls』を使います

共感・感謝の気持ちを伝えよう!

質問者からのお礼

redfox63様 前回に引き続き、ご回答頂きまして有難う御座います。 COMクラスですか・・・。 まださっぱり分かりませんが、クラスの部分を中心に調べて見ます。 また、何か御座いましたらレスを頂けると助かります^^;

関連するQ&A

  • 同じIEのウィンドウで、リンクの内容だけ変更したいのですが

    VC超初心者です。 Visual C++ 2005 Express EditionのWin32コンソールで作成しています。 ShellExecute()関数でIEを起動することはできたのですが、同じアプリで2回目に起動しようとすると、新規のIEブラウザが立ち上がってしまいます。これを既存IEウィンドウでリンク先だけ変更するには、どうすれば良いでしょうか? アプリは、コマンドプロンプト上で「xxx.exe #####」と入力しENTERを押すと、「http://localhost/index.html?id=#####」というURLでIEを起動する、といった単純なものです。 アプリはそのまま終了してしまうのでMutexでは無理なのだと気づき、皆様のお知恵を拝借したいと思っております。 よろしくお願いいたします。

  • ShellExecuteで外部アプリを起動したい

    こんにちは。 ShellExecuteを使って外部アプリを起動するために、 ShellExecute(NULL,NULL,"Program Files/XWaveClient/XWavePDA.exe",NULL,NULL,SW_SHOWNORMAL); というコードをかいているのですが、この行で  error C2065: 'ShellExecute' : undeclared identifier というコンパイルエラーがでてしまい、困っています。 ShellExecuteを使うためにはなにかヘッダファイルを includeしなくてはならないのでしょうか? 環境は、eVC++4.0です。 よろしくお願い致します。

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

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

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

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

  • ShellExecuteが起動したプロセスのID

    CreateProcessは起動したプロセスのIDをくれますが、ShellExecuteでは分からないものでしょうか。 ShellExecuteExならプロセスのハンドルを受け取ることはできますが、IDは分かりません。 ハンドルから元のIDを割り出す関数でもないですかね。

  • PATHを効かせてコマンド実行したい

    コンソールコンパイラランチャのアプリケーションを作っているのですが、 command.comの設定でつまずいてしまいました。 やりたいことは 1.コンパイラのパスを設定する 2.コンパイルコマンドをパラメータ付きで実行する の2ステップなんですが、ShellExecuteを使って別々なら出来るんですけど、 下記の方法では1.のパス設定が2回目のShellでは無効になってしまいます。 なにか良い方法はないでしょうか? ShellExecute(NULL,"open","command.com", "/c set PATH=%PATH%"+m_strCompPath,NULL,SW_SHOW); ShellExecute(NULL,"open","command.com", "/k "+CommandString,NULL,SW_SHOW); 環境はVC++6.0,MFCです。

  • 一定時間ごとにプログラムを起動させるプログラムを作りたい

    「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #include <windows.h> #include <stdio.h> void CALLBACK kidou() { char pass[255]; sprintf(pass,"./test1.exe"); ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL); } void main() { SetTimer(NULL,1,1000,kidou); } この様な感じで作成しましたが、「test.exe」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?

  • ShellExecuteでハンドルを取得

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

  • ShellExecute関数

    ShellExecuteを使い外部プログラムを実行したいんですがうまくいきません。 BINファイルをアプリケーションとして実行したいです。 ですが関連付けを行ったファイルでしかShellExecuteは起動できないようで、これらを解決する方法はありますか? 関連付けの方法はわかるのですが、関連付けをしないでもBINをアプリケーションとして実行したいのです。 最近Cを練習しはじめた初心者です、宜しくお願いします。

  • visualstudioについて

    visualstudio2008 c++でアプリケーションを作っているのですが, 画像のようなアプリケーションを起動させ, HWND hWnd = ::FindWindow(NULL,"D:\アプリケーション.exe"); ::SendMessage(hWnd,WM_SETFOCUS,0,0); としたのですが,ウィンドウハンドルを取得できていないみたいで,SendMessageが働いていません. また,HWND hWnd = ::FindWindow(NULL,"D:\アプリケーション.exe");の行のところで warning C4129: '' :とエラーがでているのですがどうしてでしょうか? 一応"D:\\アプリケーション.exe"と変えれば警告は消えます. よろしくお願いします.