检查是否仅通过WINAPI检查Winform CheckBox

时间:2015-04-01 13:52:09

标签: c# c++ winforms winapi win32gui

我的问题是这样的: 我需要检查是否仅通过WINAPI检查来自不同程序的winform复选框。

这里我如何抓住欠限制的C#HWND: 首先,我使用EnumWindows和EnumChildWindows获取桌面的所有HWND,然后我继续使用GetWindowText将我想要的文本与窗口文本进行比较,如果有匹配 - 我将其返回。

只是为了清楚 - 我可以抓住潜在的HWND。如果我打印它的文本和类名,那就是winform复选框。

现在,我要检查的复选框有WindowsForm.10.BUTTON.app.0.33c0d9d5类名。使用此功能,我问它是否是一个有效的复选框:

bool isValid(){
    if(!handleToControl) return false;
    LONG_PTR styles = GetWindowLongPtr(handleToControl, GWL_STYLE);
    bool isCheckBox = ((styles & BS_AUTO3STATE) == BS_AUTO3STATE);
    isCheckBox = isCheckBox || ((styles & BS_AUTOCHECKBOX) == BS_AUTOCHECKBOX);
    isCheckBox = isCheckBox || ((styles & BS_CHECKBOX) == BS_CHECKBOX);
    return isCheckBox;
}

现在,该功能确实有效(我在许多原生复选框和winform复选框上检查了它),它可以验证它是否是一个有效的复选框(包括我要检查的复选框)

然后,我尝试使用此函数查看是否选中了winform复选框:

bool isChecked(){
    LRESULT _isChecked = SendMessage(handleToControl, BM_GETCHECK, 0, 0);
    bool ic = !(_isChecked == BST_UNCHECKED);
    if (ic)
        return ic;
    ic = ((Button_GetState(handleToControl) & BST_CHECKED) == BST_CHECKED);
    if (ic)
        return ic;

    return false;
}
但是我悲惨地失败了。有人可以看到我的想法/代码有什么问题或提出不同的解决方案吗?

1 个答案:

答案 0 :(得分:1)

使用IAccessibility选项吗?

e.g。

(摘自http://bytes.com/topic/net/answers/637107-how-find-out-if-check-box-checked

[DllImport("oleacc.dll")]
internal static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid, [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject); 

internal enum OBJID : uint
{
    WINDOW = 0x00000000,
    SYSMENU = 0xFFFFFFFF,
    TITLEBAR = 0xFFFFFFFE,
    MENU = 0xFFFFFFFD,
    CLIENT = 0xFFFFFFFC,
    VSCROLL = 0xFFFFFFFB,
    HSCROLL = 0xFFFFFFFA,
    SIZEGRIP = 0xFFFFFFF9,
    CARET = 0xFFFFFFF8,
    CURSOR = 0xFFFFFFF7,
    ALERT = 0xFFFFFFF6,
    SOUND = 0xFFFFFFF5,
}

public const long UNCHECKED = 1048576;
public const long CHECKED = 1048592;
public const long UNCHECKED_FOCUSED = 1048580; // if control is focused
public const long CHECKED_FOCUSED = 1048596; // if control is focused

private static bool IsChecked(IntPtr handle) {
    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
    Object obj = null;
    int retValue = AccessibleObjectFromWindow(handle, (uint) OBJID.CLIENT, ref guid, ref obj);

    if (obj is IAccessible) {
        IAccessible accObj = (IAccessible) obj;
        Object result = accObj.get_accState(0);
        if (result is int) {
            int state = (int) result;
            return (state == CHECKED || state == CHECKED_FOCUSED);
        }
    }
    return false;
}