得到当前鼠标窗口标题的缺陷,谁能帮我补一下?(分数全部送上,虽是不多,但是我的全部。:( )(39分)

  • 主题发起人 主题发起人 zxp_ping
  • 开始时间 开始时间
Z

zxp_ping

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
procedure TfrmMouse.Timer1Timer(Sender: TObject);
var
    nowpoint :TPoint;
    nowhand :HWND;
    WndCaption: array[0..254] of char;
    WndClassName: array[0..254] of char;
    buffer: array[0..254] of char;
begin
    GetCursorPos(nowpoint);
    lbx.Caption := IntToStr(nowpoint.x);
    lby.Caption := IntToStr(nowpoint.y);
    nowhand := WindowFromPoint(nowpoint);
    GetWindowText(nowhand, @WndCaption, 254);
    GetClassName(nowhand, @WndClassName, 254);
    lbClass.Caption := StrPas(WndClassName);
    if ((UPPerCase(lbClass.Caption) = 'EDIT') or (UPPerCase(lbClass.Caption) = 'COMBOBOX')
         or (UPPerCase(lbClass.Caption) = 'TCOMBOBOX') or (UPPerCase(lbClass.Caption) = 'TEDIT')) then
    begin
        SendMessage(nowhand,WM_GETTEXT,254,Integer(@buffer[0]));
        lbCaption.Caption := StrPas(buffer);
    end
    else
        lbCaption.Caption := StrPas(WndCaption);

end;
 
忘了说原因了,该代码不能得到GroupBox内的文本框,标签框等所有控件的内容。??
 
没有句柄的就是不能得到阿
干什么用的
可以考虑鼠标取词
 
有什么方法可以得到句柄吗?
 
我看没什么问题啊,TLabel本来就不是窗口,当然没有句柄可取了。用你的代码查看
其他窗口中的Static还是可以成功的。
 
TO:月满西楼:

你试试查看一下QQ里别人的详细信息,或是另外程序里的,反正很多EDIT控件都得不到呀?
 
大家这么多高手,为什么不帮小弟解答一下呀?
 
用WindowFromPoint不能得到GroupBox下的任何一个子窗口控件句柄,

要想得到的话只有用GetWindow,GetWindowRect,PtInRect等API继续

递规下去(因为GroupBox下面可能还有GroupBox)

当前窗体句柄 Curr:= WindowFromPoint(....);

以curr和鼠标位置为递规函数构造以下算法:
如果Curr没有子窗口,程序结束(getWindow(curr,GW_CHILD)=0 表示无下属窗口)

否则GetWindow美举所有下属窗口,如果又子窗口位置在当前鼠标上,
对该子窗口进行递规调用(此处用GetWindowRect,PTInRect函数)

如果没有子窗口位置在当前鼠标上,curr就是了?你明白了没有????

不要告诉我不会用这些API呀!
 
我试过了,当在GroupBox里头,用getWindow(childhand,GW_CHILD)始终得到为0.???
 
我也碰见过这问题,估计你观察的程序是VC写的,在Delphi中,如果先放

Edit,在放GroupBox在Edit位置上,则Edit看不见,Edit的父窗口是Form,

反之GroupBox是Edit的父窗口

在Vc中,不论先放Edit还是GroupBox,表现形式都一样,都不能通过改变GroupBox
的位置改变Edit位置,然而先放GroupBox,通过程序或SPY++可以知道GroupBox
却是是Edit的窗口,好不奇怪!正因为如此你只能看到GroupBox的句柄,但里面
控件并不属于GroupBox,而是窗体的,调用GetWindow因此失败,建议用SPY++
看看,GroupBox下是否存在窗口,如果真不存在,问题不太好解决!
 
哦,对,的确是VC编的程序,才会出现这种情况,那我干脆枚举主窗口中的有哪些控件
在当前位置?但这样的话,就有好几个了,,,因为他们又不存在父子关系。。?
 
真奇怪,VC里GroupBox里的Label倒还做为父窗口的子窗口显示在Spy ++里,但Delphi里的
GroupBox里的Label却不见了?怎么回事?用Spy++看不到。
 
你通过递归美举所有控件,比较同鼠标位置的最佳值来确定控件了,而且我个人觉得

通过GetClassName获得类名并不好,我是Edit继承的控件就叫TT行不行啊,最好是

通过发送该窗口特定消息来确定是不是该类型窗口,比如ListBox发送LB_GETCOUNT

combobox发送CB_GetCount消息(sendmessage not postmessage),至于同鼠标位置的

最佳值也就是包含当前鼠标窗口又最小的控件,你看可以么?在VB,PB中写了程序

都不会有这种情况,这点上VC有点"神奇"!
 
好的,多谢指点。我试一下枚举所有窗口,然后将当前最小区域的控件作为当前操作的控件。
:)
 
多人接受答案了。
 
后退
顶部