2016-04-28 5 views
0

このコードでは、sendmessageを使用して別のアプリケーションのリストビューに対してすべてのアイテム(または項目番号3のコードを指定したアイテム)リストビューの項目ウィンドウハンドルを正常に取得して項目数を取得しましたが、setitemstateを使用すると、他のアプリケーションがエラーを表示して終了します(他のアプリケーションがあるので、このジョブをうまくやっていますが、そのソースコード)winAPIを使用して別のアプリケーションのlistViewにすべてのチェックを設定する

これは私のコードです:

if (windowName.Contains("Invite to Room")) { 
    IntPtr hwndChild0 = FindWindowEx(hWnd, IntPtr.Zero, "SysListView32", ""); 

    int itemCount = SendMessage(hwndChild0, LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero); 

    LV_ITEM lvItem = new LV_ITEM(); 
    lvItem.Index = 3; 
    lvItem.SubIndex = 2; 
    lvItem.TextLength = 50; 
    lvItem.Mask = LVIF_STATE; 
    lvItem.State = LVIS_SELECTED; 
    lvItem.StateMask = LVIS_SELECTED; 

    SendMessage(hwndChild0, LVM_SETITEMSTATE, 3, IntPtr.Zero); 
} 

は、これが私のLV_ITEM構造であり、

public struct LV_ITEM 
{ 
    public uint Mask; 
    public int Index; 
    public int SubIndex; 
    public int State; 
    public IntPtr StateMask; 
    public string Text; 
    public int TextLength; 
    public int ImageIndex; 
    public IntPtr LParam; 
} 

、これは使用(のSendMessageとsetitemstate)の宣言です

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
public static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam); 

private const uint LVM_FIRST = 0x1000; 
private const uint LVM_SETITEMSTATE = (LVM_FIRST + 43); 

これで任意のヘルプ?

編集:

アプリケーションエラーが次のメッセージとログファイルがあります。

「スレッドからの読み取りまたはそれが適切なアクセス権を持っていない仮想アドレスに書き込みしようとしたの」
+0

それはエラーを出してシャットダウンしても誰もいいことはしないと言われています。実際のエラーは何ですか? – MethodMan

+0

エラーはありません。正しい動作をしていません。 – Flashi

+0

エラーが発生していないかどうかを確認します。それがエラーを出すならば、どちらか?いいえ、「正しい行動をしていない」とは何ですか?より具体的にしてください。 – Gusman

答えて

0

WPARAMLPARAM、返信LRESULTなどのメッセージの中には、LVM_GETITEMCOUNTのようにデータを渡すものがあります。

他のメッセージは、LVM_SETITEMSTATEのように、使用または埋められるデータ構造体へのポインタを使用します。 IntPtr.Zeroを渡している間に、にあらかじめ塗りつぶされたLV_ITEM構造体へのポインタが必要です。そのため、ゼロポインタを逆参照しようとしている他のアプリケーションでアクセス違反が発生します。

ただし、別のプロセスで意味をなさないので、単にlvItemにポインタを渡すだけではありません。その構造体のメモリを2番目のプロセスに割り当て、初期化し、メッセージを送信し、そのメモリを読み戻す必要があります(応答が必要な場合)。

関連する問題