-->

デスクトップのアイコンを指定位置に移動する : 【VC++】

ビルドパッケージ(ソース+バイナリ) : seticon.exe

ブラウザでダウンロード
デスクトップ活用支援
Windows のデスクトップ上のアイコンの位置を変更します。
以下のようにすると、画面の外に移動して見えなくなります。

seticon.exe "マイ コンピュータ" -100 -100

但し、ログオンしなおすと画面内に表示されます。

※ 全ての環境と条件下においてテストしたわけではありません。
// *********************************************************
// デスクトップのアイコンを指定位置に移動する
//
// 【例】seticon.exe lightbox.xls 1000 700
// 【例】seticon.exe "マイ コンピュータ" -100 -100
//
// ※ 画面の外を指定すると、表示されなくなります
// ( ログインしなおすと表示されます )
// ※ 位置情報取得のサンプルを使用すると、位置保存が可能です
// ※ スペースを含む名前は "" で囲んで下さい
// *********************************************************
#include <tchar.h>
#include "lightbox\lightbox.h"

#pragma comment( lib, "lightbox\\lightbox.lib" )
#pragma comment( lib, "shlwapi.lib" )

#define DEBUG 0
int _tmain(int argc, _TCHAR* argv[])
{

	HWND hWnd;

	// デスクトップの ListView のウインドウハンドル
	hWnd = FindWindow("Progman", "Program Manager");
	hWnd = FindWindowEx(hWnd, NULL, "SHELLDLL_DefView", NULL);
	hWnd = FindWindowEx(hWnd, NULL, "SysListView32", NULL);

	DWORD pid;

	// プロセス ID
	GetWindowThreadProcessId(hWnd,&pid);

	// プロセスのハンドル
	HANDLE ph;
	ph = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
		PROCESS_VM_WRITE, false, pid);

	// そのプロセスでメモリを確保
	LPVOID ptr;
	ptr = VirtualAllocEx(ph,NULL,4096,
			MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);

	// アイテム数取得
	int nCount;
	nCount = ListView_GetItemCount( hWnd );

	int i,target;
	char buff[1024];
	DWORD numRead;
	LVITEM li;

	// 対象アイテムの取得
	for( i = 0; i < nCount; i++ ) {
		li.mask = LVIF_TEXT;
		li.iItem = i;
		li.iSubItem = 0;
		li.cchTextMax = 1024;
		li.pszText = ((LPTSTR)ptr)+1024;
		WriteProcessMemory( ph, ptr, &li, sizeof(LVITEM), &numRead );
		SendMessage( hWnd, LVM_GETITEM , 0, (LPARAM)ptr);
		ReadProcessMemory( ph, ((LPTSTR)ptr)+1024, buff, 1024, &numRead );
		if ( lstrcmp( argv[1], buff ) == 0 ) {
			target = i;
			i = -1;
			break;
		}
#if DEBUG == 1
		printf( "%s\n", buff );
#endif
	}

	// 対象アイテム無し
	if ( i != -1 ) {
		VirtualFreeEx(ph,ptr,0,MEM_RELEASE);
		CloseHandle(ph);
		return 0;
	}

	// いちおう、ここでは使わないが位置情報取得のサンプル
#if DEBUG == 1
	POINT p;
	int ret;
	ret = SendMessage(hWnd, LVM_GETITEMPOSITION, i, (LPARAM)ptr);
	ReadProcessMemory(ph,ptr,&p,sizeof(POINT),&numRead);
	printf( "%ld:%ld\n", p.x, p.y );
	
#endif

	// 位置設定
	SendMessage(hWnd,
		LVM_SETITEMPOSITION,
		target,
		MAKELPARAM((int) atoi(argv[2]), (int) atoi(argv[3]) )
	);

	// 後処理
	VirtualFreeEx(ph,ptr,0,MEM_RELEASE);
	CloseHandle(ph);

	return 0;
}