開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 GetFileList
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

エクスプローラのファイルリストを取得。

参考

GetFileList.cpp
// Unicode
#include <Windows.h>
#include <CommCtrl.h>
#include <string>
#include "resource.h"
 
using namespace std;
 
// 関数プロトタイプ宣言
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnGet(HWND hDlg);
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
void GetItemText(HWND hDlg);
 
// 外部変数
HWND g_hWnd;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc);
	return 0;
}
 
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	INT_PTR nRet = TRUE;	// メッセージを処理した
 
	switch (uMsg) {
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDC_GET:
			OnGet(hDlg);
			break;
		case IDCANCEL:
			EndDialog(hDlg, IDCANCEL);
			break;
		}
		break;
	case WM_INITDIALOG:
		nRet = TRUE;	// SetFocusでフォーカスを設定した場合はFALSE
		break;
	case WM_CLOSE:
		EndDialog(hDlg, 0);
		break;
	default:
		nRet = FALSE;	// メッセージを処理しなかった
	}
	return nRet;
}
 
void OnGet(HWND hDlg)
{
	// エスクプローラ
	HWND hWnd = FindWindowEx(NULL, NULL, L"ExploreWClass", NULL);
	if (hWnd == NULL) return;
 
	// リストビュー
	g_hWnd = NULL;
	BOOL br = EnumChildWindows(hWnd, EnumWindowsProc, 0);
	if (g_hWnd == NULL) return;
 
	GetItemText(hDlg);
}
 
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
	TCHAR buf[256];
 
	int nr = GetClassName(hWnd, buf, _countof(buf));
	if (wcscmp(buf, WC_LISTVIEW) == 0) {	// L"SysListView32"
		g_hWnd = hWnd;
		return FALSE;	// 打ち切り
	}
	BOOL br = EnumChildWindows(hWnd, EnumWindowsProc, lParam);
	return TRUE;	// 続行
}
 
void GetItemText(HWND hDlg)
{
	// 対象となるリストビューのプロセスハンドルを得る
	DWORD dwProcId = 0;
	GetWindowThreadProcessId(g_hWnd, &dwProcId);
	HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
		FALSE, dwProcId);
	if (hProc == NULL) return;
 
	// 他プロセス空間にメモリを確保
	LPTSTR pbuf = (LPTSTR)VirtualAllocEx(hProc, NULL, MAX_PATH,
		MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	LPLVITEM plvi = (LPLVITEM)VirtualAllocEx(hProc, NULL, sizeof (LVITEM),
		MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
 
	// 列数と行数
	HWND hWnd = ListView_GetHeader(g_hWnd);
	int nColNum = Header_GetItemCount(hWnd);
	int nRowNum = ListView_GetItemCount(g_hWnd);
 
	wstring str;
	TCHAR buf[32];
	swprintf_s(buf, L"[%#x]", g_hWnd);
	str += buf;
	swprintf_s(buf, L"[%d, %d]\r\n", nColNum, nRowNum);
	str += buf;
 
	// ListView_GetItemText
	LVITEM lvi;
	ZeroMemory(&lvi, sizeof (LVITEM));
	lvi.mask	= LVIF_TEXT;
	lvi.pszText	= pbuf;
	lvi.cchTextMax	= MAX_PATH;
	for (int nRow = 0; nRow < nRowNum; nRow++) {
		lvi.iItem = nRow;
		for (int nCol = 0; nCol < nColNum; nCol++) {
			lvi.iSubItem = nCol;
			WriteProcessMemory(hProc, plvi, &lvi, sizeof (LVITEM), NULL);
			BOOL br = SendMessage(g_hWnd, LVM_GETITEM, 0, (LPARAM)plvi);
			if (br) {
				TCHAR szText[MAX_PATH];
				ReadProcessMemory(hProc, pbuf, szText, MAX_PATH, NULL);
				str += szText;
			}
			str += L"\t";
		}
		str += L"\r\n";
	}
	SetDlgItemText(hDlg, IDC_EDIT, str.c_str());
 
	VirtualFreeEx(hProc, plvi, 0, MEM_RELEASE);
	VirtualFreeEx(hProc, pbuf, 0, MEM_RELEASE);
	CloseHandle(hProc);
}
 

resource.h
#define IDD_MAIN	100
 
#define IDC_STATIC	-1
#define IDC_GET		1000
#define IDC_EDIT	1001
 

GetFileList.rc
// resource script
#include <windows.h>
#include "resource.h"
 
//------------------------------------------------------------------------------
IDD_MAIN DIALOGEX 100, 100, 320, 240
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "GetFileList"
FONT 9, "MS Pゴシック"
BEGIN
	PUSHBUTTON	"Get(&G)",IDC_GET,5,5,40,15
	EDITTEXT	IDC_EDIT,5,25,310,210,
			ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL
END
 
最終更新:2012年11月22日 10:39