无法使用C#WinAPI检查复选框

时间:2012-02-23 11:05:41

标签: c# winapi checkbox automation

我正在尝试检查名为AviReComp的程序中的复选框,但我无法以某种方式执行此操作。我尝试了各种代码:

//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));

该复选框位于“字幕”部分下方的“添加”标签内,称为“启用/禁用”。

我做错了吗?

感谢您的帮助!

编辑:我现在看到这段代码确实有用了,它会检查复选框,但我仍然遇到问题,因为当我选中复选框时它不会更改所有应该更改的控件手动而不是我的程序。当我将复选框标记为已选中时,有没有办法强制父控件重绘自身或触发更改事件?

2 个答案:

答案 0 :(得分:0)

尝试使用spy ++来确保Check框的位置,如果一切都不起作用,这必须在vista及以上版本上运行我会使用Windows Automation

答案 1 :(得分:0)

当子控件的状态发生变化(响应用户操作)时,它会向其父窗口发送一些通知消息,并通过捕获这些消息来发送父窗口,执行操作。这些通知消息为WM_COMMANDWM_NOTIFY

通过监视发送到复选框控件的父窗口的消息(并通过鼠标检查控件),我注意到一条WM_COMMAND条消息和两条WM_NOTIFY条消息。当我以编程方式向复选框发送BM_SETCHECK消息时,这些消息不可用。所以魔术揭晓了。

发送WM_NOTIFY有点困难,因为你必须在另一个进程的地址空间中分配内存(使用VirtualAllocEx,用于NMHDR结构),填充内存(使用WriteProcessMemory),发送消息,然后释放分配的内存。

发送WM_COMMAND消息太简单了。我测试了它,它工作了!

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

将消息发送到复选框的父控件,使用控件的句柄作为第四个参数。函数的第三个参数应该是控件ID,ID每次都会改变。但希望程序似乎检查控制句柄而不是ID。