IE6のキャッシュを1クリックで削除するプログラム(IE7は2クリック) :【VC++】

前回 は 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 を確認