2 qq 39948207 qq_39948207 于 2017.08.29 10:07 提问

C# 怎么通过句柄知道某个按钮被单击或者某个窗口被打开?
c#

const int BM_CLICK = 0xF5;//按钮事件
const int WM_SETTEXT = 0x0C; //向文本框发送信息事件
IntPtr ParenthWnd = new IntPtr(0);
IntPtr maindHwnd = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r9_ad1", "窗口标题"); //获得登录界面框的句柄

if (maindHwnd != IntPtr.Zero)
{
//父窗口句柄:maindHwnd,子窗口句柄:IntPtr.Zero初始化为0的句柄,窗口类名:null,窗口(控件)标题:登录
IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登录"); //通过按钮名获得按钮的句柄

if (childHwnd != IntPtr.Zero)

SendMessage(childHwnd, BM_CLICK, 0, 0); //发送点击登录按钮的消息

else
MessageBox.Show("没有找到子窗口");

        }
        else
            MessageBox.Show("没有找到窗口"); 

还有,哪个大神知道怎么通过句柄使某个第三方程序的文本框得到焦点么?

3个回答

zy841958835
zy841958835   Ds   Rxr 2017.08.29 10:42
已采纳
lcmsx
lcmsx   2017.08.29 18:04

跨进程操作,得使用C/C++去实现才行。然后导出一个接口函数给C#即可。

qq_39948207
qq_39948207   2017.08.31 11:22
                                mwh1 = IntPtr.Zero;
                while (mwh1 == IntPtr.Zero)
                {
                    mwh1 = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r9_ad1", "");
                }
                //添加一个0.2s的时间间隔,以便给窗口充足的打开着准备时间           
                Thread.Sleep(200);
                if (mwh1 != IntPtr.Zero)
                {
                    childHwnd = FindWindowEx(mwh1, IntPtr.Zero, null, "是");   //通过按钮名获得按钮的句柄  
                    if (childHwnd != IntPtr.Zero)
                        SendMessage(childHwnd, BM_CLICK, 0, 0);
                }

大家好,我已经解决了这个问题,我可以 直接用while循环让程序一直找那个窗口,直到另一个程序的窗口打开被获取到就可以自动执行下面的代码了,并不需要去获取按钮的单击状态或者窗口 是否 打开的状态,我只要设置一个while循环让它找那个窗口找不到不罢休就行了,并不需要去去 获取 窗口是否打开的状态,因为他打开就执行,不打开就在while循环里面继续找就行了

Csdn user default icon
上传中...
上传图片
插入图片