首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#真的没法解决用SendMessage获取checkbox状态吗?(难)

2012-12-16 
C#真的无法解决用SendMessage获取checkbox状态吗?(难)public const UInt32 BM_GETCHECK 0x00F0public c

C#真的无法解决用SendMessage获取checkbox状态吗?(难)


  public const UInt32 BM_GETCHECK = 0x00F0;
        public const UInt32 BM_SETCHECK = 0x00F1;
        public const UInt32 BM_GETSTATE = 0x00F2;

        private void button4_Click(object sender, EventArgs e)
        {
            IntPtr hWndParent = FindWindow("WindowsForms10.Window.8.app.0.2bf8098_r16_ad1", "Form3");
            IntPtr h = FindWindowEx(hWndParent, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.2bf8098_r16_ad1", "checkBox1");
            Message msg = Message.Create(h, BM_CLICK, new IntPtr(0), new IntPtr(0));
            //点击hwnd_button句柄对应的按钮
            //PostMessage(msg.HWnd, msg.Msg, msg.WParam, msg.LParam);
            SendMessage(msg.HWnd, BM_SETCHECK, new IntPtr(0), null);
            int i = SendMessage(msg.HWnd, BM_GETSTATE, new IntPtr(0), null);
        }


一些API函数的申明我就不写了。我搜遍了所有的资料,有2个问题无解。
1.发送BM_CLICK可以选中checkbox。但是发送BM_SETCHECK就不行。
2.发送BM_GETSTATE无法获取checkbox的状态。

上面两个问题,CSDN也有人问过,帖子太久,一直都没人回答,没有正确答案,就冲着帖子被搜到的点击率,大家能否一起在这个帖子里面解决掉这个问题啊。

谢谢各位
[最优解释]
补充一下,要用这个库需要添加以下引用:
UIAutomationClient
UIAutomationClientsideProviders
UIAutomationTypes

添加名称空间:using System.Windows.Automation;
[其他解释]
什么意思,你是说一定要用BM_SETCHECK来选中,用BM_GETSTATE来获取状态?

我觉得只要实现了功能就行了吧


public static bool IsChecked(IntPtr hWnd)
        {
            return Win32Api.SendMessage(hWnd, Win32Con.BM_GETCHECK, 0, 0).ToInt32() == Win32Con.BST_CHECKED;
        }

[其他解释]
引用:
什么意思,你是说一定要用BM_SETCHECK来选中,用BM_GETSTATE来获取状态?

我觉得只要实现了功能就行了吧



C# code?



12345

public static bool IsChecked(IntPtr hWnd)         {             return Win32Api.SendMessage(hWnd, Win32C……


不会吧,你还不是用的BM_GETSTATE,我刚说了啊,那个实现不了,在C#里面获取不了checkbox状态。也没办法用BM_SETCHECK进行勾选。
上面的提问是两个问题啊。
[其他解释]
我用的BM_GETCHECK呀,可以实现呀,而且这个功能我用了很久了,没有任何问题呀
[其他解释]
不明觉厉


[其他解释]
引用:

我用的BM_GETCHECK呀,可以实现呀,而且这个功能我用了很久了,没有任何问题呀

这样吧,能否把你的demo打包上传到CSDN资源里面,别设置积分啊。我下下来看一下,然后给你回复
[其他解释]
求助楼上C#用 win api 能获得ComboBox所有的选项,并改变ComboBox的选项吗,我模拟了一直没有反映,
[其他解释]
引用:
引用:
我用的BM_GETCHECK呀,可以实现呀,而且这个功能我用了很久了,没有任何问题呀
这样吧,能否把你的demo打包上传到CSDN资源里面,别设置积分啊。我下下来看一下,然后给你回复


你的问题并不是说C#发BM_GETCHECK无法获取checkbox的状态,而是把这个消息发给用C#写的程序中的checkbox无法获取checkbox的状态,刚才我用MFC写了个测试程序,然后用C#发消息是可以正常获取的,C#里面的这个checkbox和标准windows控件中的checkbox是不一样的,你可以用spy++抓一下消息看看,C#里面checkbox的状态并不是发送BM_GETCHECK来获取的
[其他解释]
等待高手解答,C#写的程序,就是知道了正确的句柄,sendmessage(hwnd,BM_SETCHECK,1,0)也没用
[其他解释]
这里我想多说几句,关于用C#来进行一些GUI操作,最好的做法还是用.net本身自带Automation库,该库应该是最强大的GUI操作库了,所有的windows控件都可以用这个来操作,用法非常简单,例如你这个获取checkbox状态的,我写了个函数:


bool GetCheckBoxState(string windowName, string controlName)
        {
            AutomationElement desktop = AutomationElement.RootElement;
            AutomationElement window = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, windowName));
            AutomationElement checkbox = window.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, controlName));
            return ((TogglePattern)checkbox.GetCurrentPattern(TogglePattern.Pattern)).Current.ToggleState == ToggleState.On;
        }

不论你是用MFC,还是C# winform,还是WPF,用以上代码都可以准确获取checkbox的状态,而且该库还有一个配套的工具,叫UISpy,这个工具可以获取控件的各个属性以及该控件所拥有的操作方法,直接照着这个工具所获取的信息就可以写出代码来,十分容易
[其他解释]
LZ解决了没啊?
[其他解释]
找了些第三方的控制软件,
可以控制VB、PB、DELPHI等软件写的CHECKBOX。
对于.net写的还真不行。

热点排行