|開発環境|Microsoft Visual C++ 2010 Express (SP1)| |実行環境|Microsoft Windows XP Home Edition (SP3)| |プロジェクトの種類|Win32 プロジェクト| |プロジェクト名|GetFileList| |アプリケーションの種類|Windows アプリケーション| |追加のオプション|空のプロジェクト| |文字セット|Unicode| エクスプローラのファイルリストを取得。 参考 -[[ListView to CSVを作ってみよう#3>http://www.inasoft.org/lv2csv/lvcsvcom/chapter3.html]] -[[リストビュー(レポート)>http://www.nitoyon.com/vc/reference/gui/listview_report.htm]] GetFileList.cpp #highlight(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 #highlight(c){{ #define IDD_MAIN 100 #define IDC_STATIC -1 #define IDC_GET 1000 #define IDC_EDIT 1001 }} GetFileList.rc #highlight(c){{ // 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 }}