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 );
}
///////////////////////////////////////////////////
No.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 );
連絡が遅くなり、大変申し訳御座いませんでした。。。
御記述頂いたソースを参考に修正しまして、なんとか上書き起動しないようにすることができました!
但し、まだCOMクラスの理解が中途半端なので学習し直しております。
御教授頂きまして有難う御座いました。
No.1
- 回答日時:
すみません 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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- InternetExplorer(IE) Microsoft edgeのIEモードを解除したいのですが。 3 2023/04/09 13:51
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(パソコン・周辺機器) EXCELで「WEBオプションの対象ブラウザ」を変更する方法 2 2023/04/12 15:44
- その他(ブラウザ) Edge internet explorer モードのサイトの再読み込みを許可 表示されない 2 2023/03/03 12:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Chrome(クローム) グーグルクロムをマイクロソフト・エッジに切り替える方法 2 2022/06/20 10:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
勝手にウィンドウが開いて止ま...
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
作成したウインドウのサイズを...
-
VBで作成したフォーム上に電卓...
-
ExcelVBAでAPIを使って外部ウイ...
-
C言語でWin32APIを使い、子ウィ...
-
他アプリケーション’(ウィンド...
-
Excelの上下を固定したい
-
Console.WriteLine で表示されない
-
UWSCでランダムな処理をする場合
-
リモートデスクトップの中のウ...
-
ウィンドウのサイズ変更について
-
「&HFFFF」「&H1A」とは?
-
ExcelのBOOKが消えた!
-
EnumChildWindowsの使い方(VBA)
-
VBA .Value=.Value ?
-
[VBA] UserForm を Excel の W...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
勝手にウィンドウが開いて止ま...
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
[VBA] UserForm を Excel の W...
-
EnumChildWindowsの使い方(VBA)
-
Vba LongPtrについて教えてくだ...
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
ラジオボタンの初期指定
-
ExcelVBAでAPIを使って外部ウイ...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
隠れたウィンドウの画面をキャ...
-
「&HFFFF」「&H1A」とは?
-
名前を付けて保存のウィンドウ...
-
最大化と最小化ボタン
おすすめ情報