インターネットのプロパティから
通常ならば、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;
}
|
|