[C#] SendMessageでCheckBoxのBM_GETCHECKの戻り値が旨く取得できません
解決したいこと
C#で他のWindowのCheckBoxを操作するプログラムを書いていますが、WindowsAPIの関数でSenMessageを使用しようとしています。
該当するCheckBoxのハンドラを取得した上で、BM_GETCHECK(0x00F0)を送信していますが、戻り値が旨く取得できないので困っています。
使用しているPCは64bitで、プラットフォームは、x86とAnyCPUの両方を試しましたが、どちらでも同じ状況です。
APIの宣言の仕方もWebによって複数存在し、それらを片っ端から試しているような状況です。
特に、戻り値の型指定でIntPtr, int, long等があり色々と試しているのですが、
long以外は、checkの有無に関係なく全て0を戻します。
longの場合は、checkの有無に関係なく、常に"0xC735306000000000"を返してきます。
宣言の仕方に問題があるのか、関数の呼び出し方に問題があるのか、戻り値の受け方に問題があるのか、ビルドに問題があるのかなど
試行錯誤しても解決できていません。
C#で同様の操作が出来ている方がおられましたらご教授頂きたいです。
該当するソースコード
// 戻り値の型とパラメータの型をそれぞれ複数の組合せで試しています。
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern long SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
// 以下のconstもそれぞれint, uintを書き換えたりして得います。
// msg
public const int BM_GETCHECK = 0x00F0;
public const int BM_SETCHECK = 0x00F1;
// wParam
public const uint BST_CHECKED = 0x0001;
public const uint BST_UNCHECKED = 0x0000;
// 以下、ボタンをクリックしたらSendMessageをコールする。
// 呼び出す定義によってwParm, lParmの型は変更する。戻り側の型も宣言に合わせて変数rの型を変更する。
private void button4_Click(object sender, EventArgs e)
{
long r = SendMessage(hWndc, BM_GETCHECK, (uint)0,(uint)0);
textBox5.Text = String.Format("{0:X}", r);
}
<操作する側のウィンドウ>
※旨くいかないのは、操作される側のウィンドウのcheckBox1のチェック有無に対してBM_GETCHECKボタンをクリックしたときボタンの隣のtextBoxの値が出力される。
また、BST_CHECKED, BST_UNCHECKD を送信した際は操作される側のcheckBox1のチェックは変化しない。
ちなみにWM_GETTEXTはStringBuilderを使ってwParmで戻していて、問題無くテキストを取得できている。
ウィンドウの右上のtextBoxは操作される側のcheckBox1のハンドラが取得できていることを表している。
自分で試したこと
パラメータの型と戻り値の型をそれぞれ変更して実行した。
よろしくお願いします。