如果已经知道一个窗口的句柄(200分)

  • 主题发起人 主题发起人 dreamese
  • 开始时间 开始时间
D

dreamese

Unregistered / Unconfirmed
GUEST, unregistred user!
这个窗口是类似对话框一样的<br>上面有,一些按牛,其中有一个是'ok'<br><br>现在的问题是怎么把ok按牛被按下的传递过去
 
试一试给这个对话框发送 回车的消息
 
???莫名其妙!!!<br>打算送按牛到哪儿去?外婆家???
 
可以通过那个句柄得到按钮的Handle
 
大哥们,偶试过几个办法了<br>就是不行呀,拜托能给点具体可行的代码<br>谢谢了
 
我有点不太理解你的问,你说的是不是“如果想让系统知道<br>‘OK按牛’被按下的话,那么如何如何...”。<br>那也不需要那么费事啊。响应这个按钮的事件不就行了吗?<br>那可真是你想做什么就做什么。<br>如是你自已设计的对话框:响应按钮的click事件即可。<br>如果是系统的对话框:则可以 &nbsp;If ........=Idok &nbsp; Then ......<br>
 
偶没说清楚,是这样的<br>偶要运行一个程序,那个程序会定时发呆的<br><br>所以偶要自己做个程序定时去退出他,然后登陆近来<br>推出偶发了close的消息过去,已经搞定了<br>但是重起程序以后,就会出来个登陆窗口<br>密码什么的都保存着的,但是需要偶按确定才能进行登陆<br>所以偶要做个程序了。<br><br>偶现在的做法是找到这个登陆窗口的位置,然后计算出“确定”按牛的位置<br>然后把鼠标移动过来,然后做了鼠标点击的事件,这样是可以的。<br><br>但是这只能在本地用,也就是说偶只能在自己机器挂了<br>偶现在有个服务器,是2000的,偶用终端服务连上去<br>在服务器上跑程序,但是那样的话跟本地是不一样的,<br>鼠标点击是在做,但是根本没点到登陆窗口上去<br><br>估计是2000终端服务客户连上去以后,里面的活动窗口什么的<br>还是本地的,一退出,就没有活动窗口了<br><br>所以偶想还是需要用发送消息的方法来做<br><br>不知道偶说清楚没有<br><br>各路富翁帮忙了
 
不明白这位老大想做什么:)
 
很简单,看下面一段代码吧:<br>&nbsp; &nbsp; T := GetTickCount;<br>&nbsp; &nbsp; repeat<br>&nbsp; &nbsp; &nbsp; if HPWnd = 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; HPWnd := FindWindow('TQSAuthorizeForm', nil) //找到那个按钮的父窗体的Handle<br>&nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; HCWnd := FindWindowEx(HPWnd, 0, 'TButton', 'OK');//找到那个按钮,类为TButton,Caption是OK<br>&nbsp; &nbsp; &nbsp; if HPwnd = 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; Sleep(100)<br>&nbsp; &nbsp; until ((HPWnd &gt; 0) and (HCWnd &gt; 0)) or (GetTickCount - T &gt; 15000); //如果在15秒内两个都找齐了或超时就不理了。<br><br>&nbsp; &nbsp; if ((HPWnd &gt; 0) and (HCWnd &gt; 0)) then//窗体及按钮都找到了<br>&nbsp; &nbsp; &nbsp; SendMessage(HPWnd, WM_COMMAND, 0, HCWnd); &nbsp;//发一条消息说OK按钮被人按下了。<br>&nbsp; &nbsp; end;<br>看明白了?<br><br>
 
对了,我那用了Sleep(100)是为了等待那个程序运行起来。<br>每秒检测10次,15秒超时。因为你不可能让你的程序一直死在那里的吧?<br>如果可以,你就把GetTickCount什么的去掉。
 
too xianjun, <br>偶要查找的那个程序不是偶自己写的<br>HPWnd := FindWindow('TQSAuthorizeForm', nil) <br>找不到偶的窗口,不过偶用自己的办法搞定了<br>HCWnd := FindWindowEx(HPWnd, 0, 'TButton', 'OK')<br>根本找不到按牛的handle <br><br>还有SendMessage(HPWnd, WM_COMMAND, 0, HCWnd); &nbsp;<br>也没有效果,偶给自己程序里的发送也不行<br><br>具体问一下,向一个handle发送鼠标左键按下一次的,消息应该怎么发<br><br>
 
当然不是自己写的程序了! TQSAuthorizeForm是SQLNavigator4.0的验证窗体的类名,你可<br>以换成你要找的窗体的类名。 OK按钮就在这个窗体上,所以你要用FindWindowEx来查找这<br>个按钮的Handle,其第一个参数就是按钮的父窗体的Handle. 找不到的话可能是你的类名或<br>Caption没有写对! <br>SendMessage(HPWnd, WM_COMMAND, 0, HCWnd); 就是按钮按下一次的效果!<br>如果你非要用鼠标的消息,也可以,不过你要找到这个按钮在父窗体上的位置,然后向其发<br>送WM_MBUTTONDOWN及WM_MBUTTONUP消息或者找到按钮在屏幕上的位置后调用Mouse_Event函数。
 
你别告诉我你不知道怎么找那个窗体的类名, FAINT!<br>另外调用mouse_event函数前要把鼠标指针定位到那个BUTTON上,所以这个办法不好。
 
向一个handle发送鼠标左键按下一次的:<br>&nbsp; SendMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0);<br>&nbsp; SendMessage(Button1.Handle, WM_LBUTTONUP, 0, 0);<br>
 
to xianjun,<br>还是不行<br>能告诉偶你的qq或者email吗<br>偶的是2553444和dreamese@tuling.com.cn<br>联系方便点<br>
 
不可能不行的<br>我一直都用这个方法<br>你跟踪过没有?是哪儿不行?
 
算了,你的方法最多只能在当前用户使用的<br>偶是先用终端服务客户端连上去,再运行的,然后段开终端服务客户段,让程序后台跑<br>这样跟当前的编辑环境下很多东西不一样的,算了<br><br>谢谢你了,偶把分给你吧。
 
即使是用终端服务,你两个程序都是在同一环境下的啊!<br>这样就应该能找到HANDLE的。
 
理论上是应该一样<br>偶在程序做了日志纪录,是找到handle了<br>但是无论是把wm_close的消息发给windows handle还是<br>把WM_LBUTTONDOWN等时间发给按钮<br>都没什么反映<br><br>但是偶用终端服务客户端连上去,就马上起作用了<br><br>不懂了
 
后退
顶部