プロが教えるわが家の防犯対策術!

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 );
}
///////////////////////////////////////////////////

A 回答 (2件)

使うインターフェースは 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 );
    • good
    • 0
この回答へのお礼

連絡が遅くなり、大変申し訳御座いませんでした。。。

御記述頂いたソースを参考に修正しまして、なんとか上書き起動しないようにすることができました!

但し、まだCOMクラスの理解が中途半端なので学習し直しております。
御教授頂きまして有難う御座いました。

お礼日時:2007/12/17 10:33

すみません 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』を使います
    • good
    • 0
この回答へのお礼

redfox63様

前回に引き続き、ご回答頂きまして有難う御座います。

COMクラスですか・・・。
まださっぱり分かりませんが、クラスの部分を中心に調べて見ます。

また、何か御座いましたらレスを頂けると助かります^^;

お礼日時:2007/12/06 00:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!