Option Explicit '---------------------- ' ウィンドウ関数 '---------------------- '現在のマウスカーソルの位置座標を取得 Public Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINTAPI) As Long '点のx座標とy座標を定義する構造体 Public Type POINTAPI X As Long Y As Long End Type ' 指定位置にあるウィンドウのハンドルを取得 Public Declare Function WindowFromPoint Lib "user32.dll" _ (ByVal xPoint As Long, _ ByVal yPoint As Long) As Long 'ウィンドウのクラス名を取得 Private Declare Function GetClassName Lib "user32.dll" _ Alias "GetClassNameA" _ (ByVal hWnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long 'ウィンドウ位置設定 Public Declare Function SetWindowPos Lib "user32" ( _ ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _ ByVal cy As Long, ByVal wFlags As Long) As Long 'ウィンドウのZオーダーの配置を示す定数 Public Const HWND_TOPMOST = (-1) 'ウィンドウのサイズと位置の変更に関する定数 Public Const SWP_NOSIZE = &H1& Public Const SWP_NOMOVE = &H2& '---------------------- ' ウィンドウメッセージ '---------------------- Private 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 '------------------------------------ ' システム関数 '------------------------------------ '指定時間(ミリ秒)の待ち Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Const PROCESS_VM_OPERATION = &H8 Private Const PROCESS_VM_READ = &H10 Private Const PROCESS_VM_WRITE = &H20 Private Const MEM_RESERVE = &H2000 Private Const MEM_DECOMMIT = &H4000 Private Const MEM_RELEASE = &H8000 Private Const MEM_COMMIT = &H1000 Private Const PAGE_READWRITE = &H4& Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 'ウィンドウのプロセスIDとスレッドIDを取得 Private Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hWnd As Long, lpdwProcessId As Long) As Long 'メモリへの書込み Private Declare Function WriteProcessMemory Lib "kernel32" _ (ByVal hProcess As Long, lpBaseAddress As Any, _ lpBuffer As Any, ByVal nSize As Long, _ lpNumberOfBytesWritten As Long) As Long 'メモリからの読込み Private Declare Function ReadProcessMemory Lib "kernel32" _ (ByVal hProcess As Long, lpBaseAddress As Any, _ lpBuffer As Any, ByVal nSize As Long, _ lpNumberOfBytesWritten As Long) As Long '------------------------------------ 'リストビュー定義 '------------------------------------ Public Const WC_LISTVIEW = "SysListView32" Private Const LVM_FIRST = &H1000 Private Const LVM_GETTITEMCOUNT& = (LVM_FIRST + 4) 'アイテムの数を取得 Private Const LVM_GETITEMW = &H1005 'アイテムの属性を取得 Private Const LVM_GETHEADER = &H101F 'ヘッダコントロールを取得 Private Const LVM_GETITEMTEXTA = (LVM_FIRST + 45) Private Const HDM_GETITEMCOUNT = &H1200 Private Const LVIF_TEXT = &H1 Private Type LV_ITEM mask As Long iItem As Long iSubItem As Long state As Long stateMask As Long lpszText As Long cchTextMax As Long iImage As Long lParam As Long iIndent As Long End Type Type LV_TEXT 'データエリア sItemText As String * 80 End Type '------------------------------------ ' キーボード '------------------------------------ Public Const VK_ESCAPE As Integer = &H1B 'Escape Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Integer) As Integer '------------------------------- ' リストビューボックス文字列取得 '------------------------------- Public Function MyGetListViewItem(hWnd As Long) As String Dim lngByteRet As Long Dim Cnt As Long Dim p As Long, i As Long, k As Long Dim Dt As String Dim pid As Long, tid As Long 'プロセスID,スレッドID Dim hProc As Long 'プロセスハンドル Dim lngRc As Long Dim hWndHeader As Long 'リストビューヘッダのハンドル Dim nCountRow As Long, nCountCol As Long '行列数 '---------------------- ' 共有メモリアドレス '---------------------- Dim lpShared1 As Long 'パラメータエリア Dim lpShared2 As Long 'データエリア Dim lWritten As Long '書込済バイト数 '---------------------- ' リストビューパラメータ '---------------------- Dim li As LV_ITEM 'パラメータ Dim lt As LV_TEXT 'テキストエリア 'リストビューの項目(行)数取得 nCountRow = SendMessage(hWnd, LVM_GETTITEMCOUNT, 0, 0&) If nCountRow = 0 Then Exit Function 'リストビューの列数取得 hWndHeader = SendMessage(hWnd, LVM_GETHEADER, 0, ByVal 0&) nCountCol = SendMessage(hWndHeader, HDM_GETITEMCOUNT, 0, ByVal 0&) If (nCountCol = 0) Then Exit Function 'プロセスIDとスレッドID取得 tid = GetWindowThreadProcessId(hWnd, pid) '共有メモリ確保 lpShared1 = GetSharedMem(pid, LenB(li), hProc) lpShared2 = GetSharedMem(pid, LenB(lt), hProc) Dt = "" For i = 0 To nCountRow - 1 '行数分ループ For k = 0 To nCountCol - 1 '列数分ループ 'メッセージパラメータセット li.mask = LVIF_TEXT '文字情報取得 li.iItem = i '行インデックス li.iSubItem = k '列インデックス li.lpszText = lpShared2 '文字格納アドレス li.cchTextMax = LenB(lt) '文字数最大値 lngRc = WriteProcessMemory(hProc, ByVal lpShared1, li, LenB(li), lWritten) '書込み lngRc = WriteProcessMemory(hProc, ByVal lpShared2, lt, LenB(lt), lWritten) lngRc = SendMessage(hWnd, LVM_GETITEMW, 0, ByVal lpShared1) '取得依頼 lngRc = ReadProcessMemory(hProc, ByVal lpShared2, lt, LenB(lt), lWritten) '読込 p = InStr(lt.sItemText, vbNullChar) - 1 '文字数 If p > 0 Then Dt = Dt & Left(lt.sItemText, p) Dt = Dt & vbTab 'タブ追加 Next k Dt = Dt & vbCrLf '改行追加 Next i '共有メモリ開放 FreeSharedMem hProc, lpShared1, LenB(li) FreeSharedMem hProc, lpShared2, LenB(lt) MyGetListViewItem = Dt End Function '========================================== ' 共有メモリ確保と開放 '========================================== Public Function GetSharedMem(ByVal pid As Long, ByVal memSize As Long, hProc As Long) As Long hProc = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, pid) GetSharedMem = VirtualAllocEx(ByVal hProc, ByVal 0&, ByVal memSize, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE) End Function Public Sub FreeSharedMem(ByVal hProc As Long, ByVal MemAddress As Long, ByVal memSize As Long) Call VirtualFreeEx(hProc, ByVal MemAddress, memSize, MEM_RELEASE) CloseHandle hProc End Sub '========================================== ' ウィンドウ処理 '========================================== Public Function MyGetClassName(hWnd As Long) As String ' ' ウィンドウハンドルからクラス名を取得 ' Dim lngRc As Long Dim strWindowClassNameBuffer As String * 128 ' クラス名をバッファへ取得 lngRc = GetClassName(hWnd, strWindowClassNameBuffer, Len(strWindowClassNameBuffer)) ' クラス名を取得(Null文字まで) MyGetClassName = Left(strWindowClassNameBuffer, InStr(strWindowClassNameBuffer, _ vbNullChar) - 1) End Function