求助::请问如何得到当前光标所在窗口的句柄?!! ( 积分: 100 )

  • 主题发起人 主题发起人 rein
  • 开始时间 开始时间
R

rein

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]请问如何得到当前光标所在窗口的句柄?!!<br>我用<br>var cursor:longint;<br>cursor:=GetCursor();<br>但这句话只能获取当前光标的句柄...<br>请问下一步该如何做呢???[/red]
 
[red]请问如何得到当前光标所在窗口的句柄?!!<br>我用<br>var cursor:longint;<br>cursor:=GetCursor();<br>但这句话只能获取当前光标的句柄...<br>请问下一步该如何做呢???[/red]
 
用这个看看: GetGUIThreadInfo<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;pGui: TGUIThreadinfo;<br> &nbsp;nHandle: THandle;<br>begin<br> &nbsp;ZeroMemory(@pGui, SizeOf(pGui));<br> &nbsp;pGui.cbSize := SizeOf(pGui);<br> &nbsp;GetGUIThreadInfo(GetCurrentThreadID, pGui);<br> &nbsp;nHandle := pGui.hwndFocus;<br><br> &nbsp;ShowMessage(IntToStr(nHandle));<br>end;
 
没注释???[red][/red]
 
WindowFromPoint
 
function TTaiShing.GetPointClassName: string;<br>var<br> &nbsp;mPoint:TPoint;<br> &nbsp;CName:PChar;<br> &nbsp;Buf:Integer;<br> &nbsp;DTWND:HWND; //取当前光标的句柄<br>begin<br> &nbsp;Buf := 2856;<br> &nbsp;GetMem(CName,buf);<br> &nbsp;try<br> &nbsp; &nbsp;GetCursorPos(mPoint);<br> &nbsp; &nbsp;DTWND := WindowFromPoint(mPoint);<br> &nbsp; &nbsp;GetClassName(DTWND, CName, Buf);<br> &nbsp; &nbsp;Result := strPas(CName);<br> &nbsp;finally<br> &nbsp; &nbsp;FreeMem(CName,buf);<br> &nbsp;end;<br>end;
 
在DELPHI中您可以用GetCursorPos获得光标的位置,然后用WindowFromPoint返回当前光标所在位置的句柄,这样当您把光标移动到您想控制的组件的时候,就可以知道它的句柄了.<br>具体的做法如下:<br>假如您已经在TFORM1上放置了一个TEDIT,一个TTIMER(把TTIMER的Interval的属性改为100)<br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br> &nbsp;Pos: TPoint;<br> &nbsp;Handle: HWND;<br>begin<br> &nbsp;GetCursorPos(Pos); // 得到当前光标位置<br> &nbsp;Handle := WindowFromPoint(Pos); // 返回当前位置的句柄<br> &nbsp;Edit1.Caption := IntToStr(Handle);<br>end;
 
大家的方法都好像是在取得当前鼠标指向的窗口...<br><br>而我要问的是如何取得当前具有输入焦点的窗口的句柄....<br><br>怪我没把问题讲清楚....
 
调用GetForegroundwindow就可以得到当前处于激活状态的窗口句柄。比如:<br><br>Edit1.Text := IntToStr(GetForegroundwindow);
 
我要的是子窗口的句柄
 
rein朋友:您要的子窗口的句柄,除了我上面回复了您的方法之外,您还可以用回调函数EnumChildWindows和FindWindow的强力组合来枚举出父窗口中所有的子窗口的句柄.<br>具体的代码是(我为您写了个例子,例子非常简单,没什么实用价值,只是个基本的原理):<br>先在TForm上放一个TMemo和一个TButton<br>然后进入代码编辑区.<br>注意:这里的回调函数是不需要在private或是public区声明的,如果声明了就会出错,因为回调函数不是对象方法.一定要注意<br>implementation<br><br>{$R *.dfm}<br><br>function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;<br>var<br> &nbsp;buf, Caption: array[0..255] of char;<br>begin<br> &nbsp;Result := True;<br> &nbsp;GetClassName(wnd, buf, SizeOf(buf) - 1);<br> &nbsp;SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));<br> &nbsp;Lines.Add(Format('ID: %d, ClassName: %s, Caption: %s',[GetDlgCtrlID(wnd), buf, Caption]));<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;Handle:THandle;<br>begin<br> &nbsp;Handle:=FindWindow('TfrmMain',nil);//首先获得父窗口的句柄<br> &nbsp;Memo1.Clear;<br> &nbsp;EnumChildWindows(Handle, @EnumProc, Integer(memo1.Lines));//枚举出所有的子窗口的句柄<br>end;<br>您的问题就可以解决.
 
多人接受答案了。
 

Similar threads

后退
顶部