【发布时间】:2015-04-01 13:52:09
【问题描述】:
我的问题是这样的: 我需要检查是否仅通过 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;
}
但我失败得很惨。有人可以看到我的想法/代码有什么问题或提出不同的解决方案吗?
【问题讨论】:
-
MSDN says
If the button has a style other than those listed, the return value is zero.,也许这就是它不起作用的原因。 -
好的,还有其他想法如何实现吗?
-
Winforms CheckBox 控件是从头开始重新实现的,它不使用本机 Windows 控件。所以不会响应BM_GETCHECK。它也没有提供替代方案。您需要使用 UI 自动化来到达某个地方,周围有很多库。
-
那么为什么它会响应 enumchildwindows 、 getwindowtext、getclassname 等?
-
因为它还是一个窗口,只是不属于复选框对应的内置窗口类。我不确定 WinForms 是否是这种情况,以为只有 WPF 手动绘制所有组件。
标签: c# c++ winforms winapi win32gui