2012-02-23 68 views
-1

私はAviReCompというプログラム内のチェックボックスをチェックしようとしています。何とかできません。私は、コードのすべての種類を試してみた:C#WinAPIを使用してチェックボックスをチェックすることができません

//Check the checkbox 
     IntPtr SubtitlesSection = FindWindowEx(MoreOptions, IntPtr.Zero, null, "Subtitles"); 
     IntPtr AddSubtitlesCheckbox = FindWindowEx(SubtitlesSection, IntPtr.Zero, null, "Enable/Disable"); 

     SendMessage(AddSubtitlesCheckbox, BM_SETSTATE, 1, IntPtr.Zero); 
     SendMessage(AddSubtitlesCheckbox, BM_SETCHECK, 1, IntPtr.Zero); 
     SendMessage(AddSubtitlesCheckbox, WM_PAINT, 0, IntPtr.Zero); 
     SendMessage(AddSubtitlesCheckbox, WM_LBUTTONDOWN, 1, MakeLParam(10, 10)); 
     SendMessage(SubtitlesSection, WM_PARENTNOTIFY, (int)MakeLParam((int)AddSubtitlesCheckbox, WM_LBUTTONDOWN), MakeLParam(26, 31)); 
     SendMessage(SubtitlesSection, WM_PARENTNOTIFY, (int)MakeLParam((int)AddSubtitlesCheckbox, WM_LBUTTONUP), MakeLParam(26, 31)); 

チェックボックスは、字幕のセクションの下に追加のタブ内に配置され、有効/無効を呼ばれています。

何か間違っていますか?

ありがとうございました!

編集:は、私は今、このコードは実際に動作し、それがチェックボックスにチェックを入れませんが、私はまだそれは私が手動ではなく内部のチェックボックスにチェックを入れたときに変更することになっているすべてのコントロールは変更されませんので、問題があることがわかり私のプログラム。チェックボックスをオンにしたときに、親コントロールに強制的に再描画させるか、変更イベントをトリガーする方法はありますか?

+0

エラーハンドリングとメッセージを追加して、正確にどこが失敗するのか(その理由)を確認します。 –

+0

エラーは発生しません。単にチェックボックスをチェックしません。 –

+1

winapiを使用すると、エラーが発生することがあります。 IntPtrがIntPtr.Zeroの場合は例外をスローします。それは可能性が高いです。 –

答えて

0

は、すべてがうまくいかなかった場合は、チェックボックスの位置を確認するために、++スパイを使用しようとすると、これはVista上で実行する必要があり、私はWindows Automation

+0

私はspy ++を使ってみましたが、チェックボックスを見つけましたが、なんらかの理由でそれをチェックすることができません。 –

0

使用する上記の場合は、子コントロールの状態が変化(ユーザアクションに応答して)、それは親ウィンドウと親ウィンドウにそれらのメッセージをキャッチすることによっていくつかの通知メッセージを送り、アクションを実行する。これらの通知メッセージはWM_COMMANDWM_NOTIFYです。

チェックボックスコントロールの親ウィンドウに送信されたメッセージを監視して(そしてコントロールをマウスでチェックして)、私はWM_COMMANDメッセージと2つのWM_NOTIFYメッセージに気付きました。これらのメッセージは、私がプログラムでBM_SETCHECKメッセージをチェックボックスに送信したときには利用できませんでした。だから魔法が明らかになった。あなたは、(NMHDR構造のため、VirtualAllocExを使用して)他のプロセスのアドレス空間にメモリを割り当てる(WriteProcessMemoryを使用して)メモリを埋め、メッセージを送信した後、解放する必要があるためWM_NOTIFYを送信

は、少し難しいです割り当てられたメモリ。

送信WM_COMMANDメッセージが単純すぎます。私はそれをテストし、それは働いた!

Win32.SendMessage(SubtitlesSection, Win32.Message.WM_COMMAND, 0, AddSubtitlesCheckbox); 

コントロールのハンドルを4番目のパラメータとして使用して、メッセージがチェックボックスの親コントロールに送信されます。関数の3番目のパラメータは制御IDでなければならず、IDは毎回変更されます。しかし、うまくいけば、プログラムがIDではなくコントロールハンドルをチェックしているようです。

関連する問題