Windows上で動作するプログラムに含まれる様々な部品は、「ウィンドウ」として管理されています。これは、通常、Windows上で目にする「ウィンドウ」と同様のオブジェクトとして存在し、ウィンドウハンドルを用いて管理されるものです。
そのため、リストビューを探すには、ウィンドウと子ウィンドウを列挙するためのAPIである、EnumWindow() APIとEnumChildWindow() APIを用いて、クラス名が WC_LISTVIEW("SysListView32")となっているウィンドウを探せばよいことになります。
リストビューもウィンドウの一種であるので、1の方法で得られたウィンドウハンドルに対して、SendMessage() APIを用いてメッセージを投げることで、情報を取得することができます。例えば、リストビュー内に存在するアイテムの個数を取得するには、LVM_GETITEMCOUNT メッセージを投げます。
SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
しかし、この方法では、リストビューから数値を取得することはできても、文字列を取得することはできません。
他のプロセス上で実行されているリストビューから、単純に文字列を取得することはできません。これは、次のような理由があるためです。
文字列は一般に、多くのバイトからなるデータです。そのため、文字列は数値のように単純に取得できるものではなく、「○○のアドレスから始めるメモリエリアに、文字列データを書き込んでくれ」とお願いすることになります。
しかし、プロセスが違うと、メモリが別領域になります。日常的な住所でたとえるならば、南区1234番地と、西区1234番地は、同じ1234でも同じ場所ではないといったところです。すなわち、あるプロセスで 0x11223344 と示されているメモリ上のアドレスに対しては、別のプロセスから 0x11223344 というアドレスではアクセスできないことになります。
つまり、文字列を読み出したいプロセスが、文字列格納用としてメモリ確保を行い、0x11223344 というアドレスを取得したとしても、リストビューを保持しているプロセスがそのアドレスへアクセスできるわけではないため、文字列を取得することができないのです。

VirtualAllocEx()は、指定したプロセスにメモリ確保を行わせるためのAPIです。そして、ReadProcessMemory()は、指定したプロセスからメモリの内容を読み込むためのAPIです。
これらを組み合わせて、リストビューから文字列を得ることができます。

原理としては、これで文字列を読み出すことができますが、これでは不十分です。
リストビューから文字列を取得するためには、LVM_GETITEM メッセージを使いますが、このメッセージは指示を受けるための構造体へのポインタを受け取ります。このポインタも、相手先プロセス内のメモリにある必要があります。
そのため、この構造体自体も、VirtualAllocExを使って相手先プロセス内にメモリ確保し、WriteProcessMemory() を使って指示データを書き込みます。
CreateFileMapping()/MapViewOfFile() は、ファイルマッピングオブジェクトを作成し、メモリに結びつけるためのAPIです。これは、プロセス間共有メモリとして扱うことができます。

3.1と同様に、指示を与えるための構造体も、このファイルマッピングオブジェクト内に作成します。