前回 は IE6 だけでしたが、IE7 も試してみました。 ただ、IE7 はもともと 1 クリック増えてしまっているので、キャッシュを削除するのに 2 クリックが必要です。( これ以上頑張ってもあまり良いサンプルにはならないので ) 以前のターゲットウインドウは一番上位で、WM_COMMAND を送って処理されていました。 今回は、その下のタブコントロールに対して WM_COMMAND を送っています。 どちらでも動作していますが、Winspector Spy の結果では、タブコントロールに送るのが 正当なような気がします。 ブラウザでダウンロード ↓IE7 上記削除で、↓のダイアログが表示されて、さらに確認メッセージボックスが表示されます ソースコードIE6 か IE7 かの判断に、レジストリを使用しました。 // ********************************************************* // Rundll でインターネットのプロパティを表示して、 // プログラムで「削除」をクリックする // IE6 では、あと 1 クリックで削除 // IE7 では、まださらに 2 クリック必要 // ********************************************************* #include <windows.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <stdio.h> BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ); BOOL CALLBACK EnumWindowsProc2( HWND hWnd, LPARAM lParam ); DWORD pid; HWND hTarget; HWND hPost; HWND hChild; // ********************************************************* // Windows アプリケーションとしてのエントリポイント // Link.exe で /SUBSYSTEM:WINDOWS がデフォルトで // 指定される事になります // ********************************************************* int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { // プログラムを実行して、PID を取得し // PID から Window ハンドルを取得 int ret; PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory( &pi , sizeof(PROCESS_INFORMATION)); ZeroMemory( &si , sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ret = CreateProcess( NULL, "RunDll32.exe shell32.dll,Control_RunDLL inetcpl.cpl", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForInputIdle(pi.hProcess,60000); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); char buff[256]; sprintf( buff, "%d", pi.dwProcessId ); pid = pi.dwProcessId; // Window ハンドルを Callback で取得 EnumWindows( EnumWindowsProc, 0 ); EnumChildWindows( hTarget, EnumWindowsProc2, 0 ); // レジストリから、IE のバージョン取得 // 確実にするには IE のオブジェクトから取得するべきですが int iev = 6; LONG nRet; HKEY hKey; DWORD nType,nSize; char data[80]; nRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Internet Explorer", 0, KEY_ALL_ACCESS, &hKey ); if ( nRet == ERROR_SUCCESS ) { nSize = 80; nRet = RegQueryValueEx( hKey, "Version", NULL, &nType, (LPBYTE)data, &nSize ); if ( nRet == ERROR_SUCCESS ) { data[1] = 0x00; iev = atol( data ); } } // LPARAM は使用していないようなので省略しました // IE6 と IE7 でテキストが違いますし、取得するのが面倒 // IE6 => 624, IE7 => 5501 ( Winspector で確認 ) if ( iev == 6 ) { // IE6 PostMessage(hPost, 0x111, 624, (LPARAM)0); // WM_COMMAND } if ( iev == 7 ) { // IE7 PostMessage(hPost, 0x111, 5501, (LPARAM)0); // WM_COMMAND } // WM_CLOSE( 閉じる ) PostMessage(hTarget, 0x10, 0, 0); RegCloseKey( hKey ); return 0; } // ********************************************************* // ウインドウの列挙(1) // ※ トップレベル用 // ********************************************************* BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ) { char buff[512]; DWORD ProcessId; GetWindowText( hWnd, buff, 512 ); GetClassName( hWnd, buff, 512 ); GetWindowThreadProcessId( hWnd, &ProcessId ); if ( pid == ProcessId ) { if ( lstrcmp( buff, "#32770" ) == 0 ) { hTarget = hWnd; return false; } } return TRUE; } // ********************************************************* // ウインドウの列挙(2) // ※ チャイルド用 // ********************************************************* BOOL CALLBACK EnumWindowsProc2( HWND hWnd, LPARAM lParam ) { char buff[512]; GetWindowText( hWnd, buff, 512 ); if ( lstrcmp( buff, "全般" ) == 0 ) { hPost = hWnd; return false; } return TRUE; } Winspector Spy でボタン ID を確認IE7 と相性悪いようなんですが・・・ プロセスから該当ウインドウのメッセージを選択 メッセージフィルタを選択 WM_COMMAND のみをフィルタに設定 目的のボタンをクリックして、ボタンID を確認 |