IEのキャッシュを1クリックで削除 : 【VC++】



インターネットのプロパティから
通常ならば、2 クリックなのを 1 クリックをプログラムが請け負って実行しています
0 クリックにもできるのですが、確認無しはちょっと問題があると思って避けました。

この手の処理は、やはり C++ で API を呼ぶと簡単です。
ひさしぶりにこの手のプログラム書きましたが、コード自体は20分ほど。
前準備(ツール検証やらテストやら)に、えらいかかりましたが・・・

プロジェクトは、マルチバイトです(非Unicode)
WinMain にしたのは、デフォルトでコンソールウインドウが出るのを避ける為で、
int main() でも動きます。

PostMessage(hTarget, 0x111, 624, (LPARAM)hChild); が、
ボタンを押してるところですが、
WM_COMMAND の BN_CLICKED(0) です。ボタンID(624) は、Winspector で目視
しているので、他の環境でも確認が必要ではあります( ここは Windows2000+IE6 )
最後の引数は、ボタンのウインドウハンドルなので、プログラムで取得しています。

PostMessage(hTarget, 0x10, 0, 0); は WM_CLOSE です。

Winspector は、日本語が表示されないですが、手元に Spy++ が無かったので。
ヒマな時に日本語化してみようかとは思います。
#include "stdafx.h"
#include "clear_iecache.h"
#include <stdio.h>

BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam );
BOOL CALLBACK EnumWindowsProc2( HWND hWnd, LPARAM lParam );
DWORD pid;
HWND hTarget;
HWND hChild;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	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;

	EnumWindows( EnumWindowsProc, 0 );
	EnumChildWindows( hTarget, EnumWindowsProc2, 0 );

	PostMessage(hTarget, 0x111, 624, (LPARAM)hChild);
	PostMessage(hTarget, 0x10, 0, 0);

	return 0;
}

BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
{
	char buff[512];
	DWORD ProcessId;

	if ( IsWindowVisible( hWnd ) ) {

		GetWindowText( hWnd, buff, 512 );
		GetClassName( hWnd, buff, 512 );
		GetWindowThreadProcessId( hWnd, &ProcessId );
		if ( pid == ProcessId ) {
			hTarget = hWnd;
			return false;
		}

	}

	return TRUE;

}

BOOL CALLBACK EnumWindowsProc2( HWND hWnd, LPARAM lParam )
{
	char buff[512];

	if ( IsWindowVisible( hWnd ) ) {

		GetWindowText( hWnd, buff, 512 );
		if ( memcmp( buff, "ファイルの削除", 14 ) == 0 ) {
			hChild = hWnd;
			return false;
		}

	}

	return TRUE;

}