2011-09-16 45 views
3

私はこれを徹夜で戦ってきました。私は何が間違っているのではない。デスクトップアイコン+キャプションサイズを取得しようとしています。デスクトップのハンドルを見つけてSysListView32_hwndという変数に入れておく関数があります。私はWindowsスパイプログラムで正しいことを確認しました。ここで私は問題を抱えている部分です。LVM_GETITEMRECTメッセージでデスクトップアイコンのサイズを取得する

Rectangle rct = new Rectangle(); 
IntPtr pRct = Marshal.AllocHGlobal(Marshal.SizeOf(rct)); 
Marshal.StructureToPtr(rct, pRct, true); 

SendMessage(SysListView32_hwnd, LVM_GETITEMRECT, (IntPtr)0, pRct); 

Rectangle Rect = (Rectangle)Marshal.PtrToStructure(pRct, typeof(Rectangle)); 
Marshal.FreeHGlobal(pRct); 
Debug.WriteLine(Rect.Height + " " + Rect.Width); 

毎回エクスプローラがクラッシュします。 のC#のVisual Studio 2010 のWindows 7 x64および私は

+0

エクスプローラをクラッシュさせている/例外を引き起こしている行がわかりますか? – jadarnel27

+0

@ jardarnel27それは簡単です、それはSendMessageです –

+0

@Davidあなたのために、おそらく簡単です。プログラムのどこが爆発しているのかという疑問を言うのは良い習慣です。そうすれば、人々は推測/推測する必要はありません。 – jadarnel27

答えて

1

これは、大規模な編集前の元の質問に対処し、必要に応じて

Hereは私の完全なアプリです64ビットプログラムとしてコンパイルしています。

これは、作成した方法がターゲットウィンドウハンドルを所有するプロセスから呼び出すときにのみ機能するため、失敗します。これはポインタを渡すためですが、それはあなたのプロセスでのみ有効です。それが他のプロセスに着くとすぐに、無意味なアドレスを参照します。そして、たとえそれが何かを意味したとしても、プロセスは、システムからの助けを借りて、別のプロセスメモリを読み取ることができません。自然に探検家の爆弾。

解決策は、VirtualAllocEx()を使用してエクスプローラプロセスでメモリを割り当てることです。その後、メッセージを送信します。その後、ReadProcessMemory()を使用して、rectの内容をマーシャリングしてプロセスに戻します。これに最もよく引用されるコードサンプルは、Code Project articleです。この例ではLVM_GETITEMTEXTを使用していますが、原則は同じです。

2

これは、広範な編集で質問された追加の質問に対処します。

我々はLVITEMsで作業しているようにそれは私には思われるが、VirtualAllocExsizeof(uint)を指定します。

VirtualAllocEx()dwSizeパラメータのドキュメントは、MSDNに、状態:

を割り当てるメモリの領域のサイズ(バイト単位)。

lpAddressがNULLの場合、関数はdwSizeを次のページ境界まで丸めます。

lpAddressがNULLでない場合、関数はlpAddressからlpAddress + dwSizeまでの範囲の1つ以上のバイトを含むすべてのページを割り当てます。これは、たとえば、ページ境界に跨る2バイトの範囲が関数によって両方のページを割り当てることを意味します。

つまり、ページ全体が割り当てられます。ページが4KBなので運が増えています。 dwSizeが必要なバッファに十分な大きさであることを確認する必要があります。

なぜpszText =(IntPtr)((int)lpBaseAddress + Marshal.SizeOf(typeof(LVITEM))))ですか?構造の終わりを指すだけではないでしょうか。

はいこれは構造の最後を指しています。要点は、pszTextフィールドがLVITEMで、呼び出し元によって割り当てられたバッファを指している必要があるということです。このコードを書いた人は誰でも、構造体の最後にスペアバッファスペースを使うことにしました。構造体はpszTextに256バイトが含まれていると宣言しているため、4KBページの残りの部分に簡単に収まります。それは動作しますが、少し不透明です。

+1

これは私が理解できなかったことです。 –

+0

+1の両方に優れた回答。 – jadarnel27

関連する問題