如何获得桌面上所有的窗口句柄 ( 积分: 20 )

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

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
查找桌面上所有窗口的句柄,顺便问一下,句柄的含义<br>我想实现的过程是,当启动某一WINDOWS应用程序时,执行该段代码,通过查找所有的窗口句柄,来获取窗口标题,然后再根据窗口标题内容给出不同的提示信息.<br>以上过程不知道是否可以实现?<br>另想问一下,如何通过代码将ORACLE某一服务的启动类型修改为禁用类型.<br>谢谢各位参与讨论
 
查找桌面上所有窗口的句柄,顺便问一下,句柄的含义<br>我想实现的过程是,当启动某一WINDOWS应用程序时,执行该段代码,通过查找所有的窗口句柄,来获取窗口标题,然后再根据窗口标题内容给出不同的提示信息.<br>以上过程不知道是否可以实现?<br>另想问一下,如何通过代码将ORACLE某一服务的启动类型修改为禁用类型.<br>谢谢各位参与讨论
 
function proc(handle:HWND;lParam:LPARAM):BOOL; //每个handle会在这里调用一次<br>begin<br>//所有的handle会在这里出现,你这里可以对handle进行处理<br>result:=true;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>EnumWindows(@proc,0);<br>end;<br>
 
如何处理,代码可否详细些,Finwindow是否可以实现啊?
 
函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。EnumThreadWindows函数继续到所有顶层窗口枚举完为止或回调函数返回FALSE为止函数原型:BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);<br><br> &nbsp; &nbsp;参数:<br><br> &nbsp; &nbsp;lpEnumFunc:指向一个应用程序定义的回调数指针,请参看EnumWindowsProc。<br><br> &nbsp; &nbsp;lPararm:指定一个传递给回调函数的应用程序定义值。<br><br> &nbsp; &nbsp;返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。<br><br> &nbsp; &nbsp;备注:EnumWindows函数不列举子窗口。<br>
 
unit Unit1;<br><br>interface<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs, StdCtrls;<br><br>type<br> &nbsp;TForm1 = class(TForm)<br> &nbsp; &nbsp;Button1: TButton;<br> &nbsp; &nbsp;ListBox1: TListBox;<br> &nbsp; &nbsp;procedure Button1Click(Sender: TObject);<br> &nbsp;private<br> &nbsp; &nbsp;{ Private declarations }<br> &nbsp;public<br> &nbsp; &nbsp;{ Public declarations }<br> &nbsp;end;<br><br>var<br> &nbsp;Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>function GetText(Wnd: HWND): string;<br>var <br> &nbsp;textlength: Integer;<br> &nbsp;Text: PChar;<br>begin<br> &nbsp;textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);<br> &nbsp;if textlength = 0 then Result := ''<br> &nbsp;else<br> &nbsp;begin<br> &nbsp; &nbsp;GetMem(Text, textlength + 1);<br> &nbsp; &nbsp;SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));<br> &nbsp; &nbsp;Result := Text;<br> &nbsp; &nbsp;FreeMem(Text);<br> &nbsp;end;<br>end;<br><br>function EnumWindowsProc(Wnd: HWND; lParam: lParam): BOOL; stdcall;<br>begin<br> &nbsp;Result := True;<br> &nbsp;if (IsWindowVisible(Wnd)) and (Trim(GetText(Wnd))&amp;lt;&amp;gt;'')then<br> &nbsp; &nbsp;Form1.Listbox1.Items.Add('Handle: ' + IntToStr(Wnd) + ',Text: &nbsp;' + GetText(Wnd));<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;Param: Longint;<br>begin<br> &nbsp;EnumWindows(@EnumWindowsProc, Param);<br>end;<br><br>end.
 
函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。EnumThreadWindows函数继续到所有顶层窗口枚举完为止或回调函数返回FALSE为止函数原型:BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);<br><br> &nbsp; &nbsp;参数:<br><br> &nbsp; &nbsp;lpEnumFunc:指向一个应用程序定义的回调数指针,请参看EnumWindowsProc。<br><br> &nbsp; &nbsp;lPararm:指定一个传递给回调函数的应用程序定义值。<br><br> &nbsp; &nbsp;返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。<br><br> &nbsp; &nbsp;备注:EnumWindows函数不列举子窗口。<br>
 
关键你是要用来干什么,如果你是要查找一个已知标题的窗口,那么不用枚举,<br>一个 FindWindow(nil,'标题' ) 就可以找到了
 
咦? Pipi. 大侠重出江湖 ?? 楼主请下载, http://www.axdisk.cn/vip/liumazi/OldDemo/EnumDemo.rar
 
也不算重出江湖,空闲的时候写写帖子答些容易的问题骗骗分罢了
 
循环调用FindWindowEx,直到返回值为0.怎么用看帮助
 
多谢各位,但由于小弟分数有限,现只能意思一下,还望各位见谅,对于刘麻子的奉献更是感激不尽。<br>但对ORACLE启动类型修改仍然不知所措,希望得到高手的指点,不知道是否得对注册表操作?<br><br>
 
代码:
<br>首先需要<br>uses winsvc;<br><br>var<br> &nbsp;a,b:SC_HANDLE;<br>begin<br>a:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);<br>b:=OpenService(a,'服务名',SERVICE_ALL_ACCESS);<br>ChangeServiceConfig(b,SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE,nil,nil,nil,nil,nil,nil,nil);<br>CloseserviceHandle(b);<br>CloseserviceHandle(a);<br>end;<br><br>注意服务名不一定是你在服务管理器看到的名称,比如,在win2000的服务管理器,看到<br>&quot;Indexing service&quot;这个服务,这个并不是他的服务名,你要双击它,里面显示了真的服务名“cisvc”
 
谢谢各位了,我去TRY了
 
后退
顶部