無限ループ リストビューから項目数/列数を取得 列項目はタブで、行項目は改行で区切る。 ESCキーが押されると取得ループ終了。 取得したデータをエクセルに貼り付けると、 タブ区切りなので、 それぞれの項目がセルに分割表示される。 |
![]() |
リストビューからの項目取得処理
リストビューの項目(行)数取得(SendMessage(hWnd,LVM_GETTITEMCOUNT)) − 行数が0の時は何もしない注:プロセス間を跨いだデータの受け渡しには個別のプロセ ス内メモリは使用できない。
リストビューヘッダのハンドルを取得( SendMessage(hWnd, LVM_GETHEADER))
リストビューヘッダの項目(列)数を取得(SendMessage(hWndHeader, HDM_GETITEMCOUNT, 0, ByVal 0&)) − 列数が0の時は何もしない
対象のプロセスID取得(GetWindowThreadProcessId) ・・・ OpenProcessで必要
対象のプロセスが共有メモリへの読み書き(ReadProcessMemory/WriteProcessMemory)出来るようにする (OpenProcess)
共有メモリの確保(メッセージパラメータとデータ読込み用)(VirtualAllocEx)
行数分ループ
列数分ループ
メッセージパラメータセット(取得情報種別、行インデックス、列インデックス、バッファアドレス、バッファサイ ズ)
共有メモリにパラメータ書込み(WriteProcessMemory)
リストビューに依頼(SendMessage(hWnd, LVM_GETITEMW ・・・)
共有メモリに書き込まれたデータを読込む(ReadProcessMemory)
データ整形
Next 列
Next 行
共有メモリの開放 (VirtualFreeEx)
PROCESS_VM_OPERATION | 取得したハンドルを VirtualProtectEx 関数、及び WriteProcessMemory 関数で使用できるようにする |
PROCESS_VM_READ | 取得したハンドルを ReadProcessMemory 関数で使用できるようにする |
PROCESS_VM_WRITE | 取得したハンドルを WriteProcessMemory 関数で使用できるようにする |
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long
項目取得(LVM_GETITEMW)の場合のlParm の構成(wParmは使用しない) また、本処理で使用しない項目の記述は省略 Private Type LV_ITEM mask As Long '有効メンバを示すフラグ(LVIF_TEXT=テキスト) iItem As Long 'アイテム(行)のインデックス(先頭が0) iSubItem As Long 'サブアイテム(列)インデックス(左端が0) state As Long ' stateMask As Long ' lpszText As Long 'アイテムの文字列 cchTextMax As Long 'lpszTextのサイズ iImage As Long ' lParam As Long ' iIndent As Long ' End Type
![]() |
![]() |
コントロール配置 | 実行イメージ |
フォームを追加し、下記のコントロールを配置
コマンドボタン 1個
ラベル 1個
テキストボックス 1個 MultiLine=True
ScrollBar=3-両方 にしておく