我的问题是这样的: 我需要检查是否仅通过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;
}
但是我悲惨地失败了。有人可以看到我的想法/代码有什么问题或提出不同的解决方案吗?
答案 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;
}