IEにリンクを指定する方法
- 2つのIEが起動しており、特定のIEにリンク先を上書きする方法を教えてください。
- 指定したIEウィンドウ名のハンドルを取得してリンクを指定する方法を使用していますが、最後に起動したIEウィンドウに上書きされてしまいます。
- ShellExecute関数の第一引数がハンドルを持つウィンドウを指していると認識していますが、違いましたでしょうか?
- ベストアンサー
任意の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 ); } ///////////////////////////////////////////////////
- foot-peng
- お礼率93% (15/16)
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (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 );
その他の回答 (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
- 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"と変えれば警告は消えます. よろしくお願いします.
- ベストアンサー
- C・C++・C#
- ShellExecuteでDOSコマンド実行したら...
VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを 実行したいのですが、うまくいきません。 1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW); ...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、 なにも実行されません。 2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW); ...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。 3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW); ...としてもファイルが作られず、2.と全く同じ結果になってしまいます。 これはどうしてこのような現象が起きるのでしょうか? DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。 あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?
- ベストアンサー
- C・C++・C#
- VC++からブラウザを起動して・・・
VC++&MFCで画面を作成しています。 作成した画面のあるボタンをクリックすると、規定のブラウザが起動され、 指定したURLを表示にいくという処理を行いたいので、 ShellExecute( NULL, "open", "http://xxx.xxx.co.jp/", NULL, NULL, SW_SHOWNORMAL ); という様な感じでブラウザを起動しているのですが、このブラウザの起動時に、 アドレスバー・ツールバー等を非表示にしたいのです。 ShellExecute()じゃなくても良いので、VC++(SDK、MFC何でも可)で 実現する方法はあるのでしょうか?。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ウインドウの位置を知る。
c++BuilderXE2です。 HWND hwnd=FindWindow(NULL,L"P_orderwb"); で取得したウィンドウのスクリーン上の位置を知るにはどうすればよいですか。 ウインドウハンドルに対応した位置のプロパティがわからないのです。 例えば hwnd->Left,hwnd->Top などでできないかと試しましたが、メンバーではありませんでした。
- ベストアンサー
- C・C++・C#
- 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ファイルにリンクしているのではなく、何か別のものにリンクしているようです。 このタイプのショートカットの起動の方法を教えてください。 よろしくお願いします。
- 締切済み
- C・C++・C#
- C++でタスクマネージャーを最小化
C++Win32コンソールアプリケーションを作成しています。 タスクマネージャーを最小化させるプログラムを考えているのですが、上手くできません。 #include<iostream> #include<windows.h> using namespace std; int main() { for (;;) { HWND hwnd = FindWindow("TaskManagerWindow", NULL); if (hwnd != NULL) { cout << "成功" << endl; ShowWindow(hwnd,SW_MINIMIZE); } else cout << "失敗" << endl; Sleep(300); } return 0; } のようにしているのですが上手くできません。 Notepadのようなファイルは最小化できるのですが、タスクマネージャーに限ってできないのです。 どのようにすればよいでしょうか。 又、一時的に見えなくすればいいので終了や透明化等の他の方法でも構いません。 ご教授お願いします。
- 締切済み
- C・C++・C#
- 一定時間ごとにプログラムを起動させるプログラムを作りたい
「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #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」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?
- ベストアンサー
- C・C++・C#
- 別アプリ終了させる
いつもお世話になります。 再度質問ですが、 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を持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。
- 締切済み
- C・C++・C#
- ShellExecuteで外部アプリを起動したい
こんにちは。 ShellExecuteを使って外部アプリを起動するために、 ShellExecute(NULL,NULL,"Program Files/XWaveClient/XWavePDA.exe",NULL,NULL,SW_SHOWNORMAL); というコードをかいているのですが、この行で error C2065: 'ShellExecute' : undeclared identifier というコンパイルエラーがでてしまい、困っています。 ShellExecuteを使うためにはなにかヘッダファイルを includeしなくてはならないのでしょうか? 環境は、eVC++4.0です。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- 同じIEのウィンドウで、リンクの内容だけ変更したいのですが
VC超初心者です。 Visual C++ 2005 Express EditionのWin32コンソールで作成しています。 ShellExecute()関数でIEを起動することはできたのですが、同じアプリで2回目に起動しようとすると、新規のIEブラウザが立ち上がってしまいます。これを既存IEウィンドウでリンク先だけ変更するには、どうすれば良いでしょうか? アプリは、コマンドプロンプト上で「xxx.exe #####」と入力しENTERを押すと、「http://localhost/index.html?id=#####」というURLでIEを起動する、といった単純なものです。 アプリはそのまま終了してしまうのでMutexでは無理なのだと気づき、皆様のお知恵を拝借したいと思っております。 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
お礼
連絡が遅くなり、大変申し訳御座いませんでした。。。 御記述頂いたソースを参考に修正しまして、なんとか上書き起動しないようにすることができました! 但し、まだCOMクラスの理解が中途半端なので学習し直しております。 御教授頂きまして有難う御座いました。