開発環境 |
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