在service中为什么使用findwindows得不到想要的窗口句柄 ( 积分: 100 )

  • 主题发起人 主题发起人 cangyu
  • 开始时间 开始时间
C

cangyu

Unregistered / Unconfirmed
GUEST, unregistred user!
我在service开了一个线程,在这个线程使用findwindows了api来查找TForm1这个窗口,但却找不到想要的窗口句柄。这是为什么啊,哪位高人指点一下,感激不尽!
 
我在service开了一个线程,在这个线程使用findwindows了api来查找TForm1这个窗口,但却找不到想要的窗口句柄。这是为什么啊,哪位高人指点一下,感激不尽!
 
好,帮顶<br><br><br> <br> --------签名档---------------------------<br> <br> 比肩国内顶尖源码下载站点 &nbsp;-&gt; 源码我爱你<br> <br> http://www.source520.com &nbsp; &nbsp; &nbsp; &nbsp; <br> http://www.source520.net<br><br> 80G源码电子书免费免注册下载,大量精辟技术文档库随时更新<br> ******************************************************************<br> 附:为了站点持续发展,现有本站近年来收藏的大量大型商业源码低价出售,<br> &nbsp; &nbsp;详情请进入以下链接查看:<br> &nbsp; &nbsp;http://www.source520.com/building_delphi.htm<br> &nbsp; &nbsp;<br> &nbsp; 浏览商业代码请从如下URL进入查看实物:<br> &nbsp; 1.商业源码库1: &nbsp; ftp://source520see3:browse@61.152.199.245/<br> &nbsp; 2.商业源码库2: &nbsp; ftp://source520see2:browse@61.152.199.245/
 
有高人可以指点吗
 
service.exe?这个进程?<br>这个程序好像是VC写的他不是,使用Delphi的窗口类名命名规则<br><br>至于如果想找到的话用窗口枚举吧。在枚举过程中增加判断自窗口的进程<br>来选择,这样就可以列出service.exe的所有窗口了~<br><br>我是2k也许接过和XP不一样所以我就不贴出窗口列表了
 
可以先用spy++来看看这个窗口的类名和标题名,再在程序中将类名或标题名进行判断。
 
写个窗口枚举好了。。。直接枚举一个进程名的所有窗口<br>1.去进程PID<br>2.枚举窗口的同时判断窗口进程是否和,目标进程一样<br>3.填入记录数据中<br>
代码:
<br>unit Unit1;<br><br>interface<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs,tlhelp32, StdCtrls;<br><br>type<br> &nbsp;TForm1 = class(TForm)<br> &nbsp; &nbsp;Edit1: TEdit;<br> &nbsp; &nbsp;ListBox1: TListBox;<br> &nbsp; &nbsp;Button1: TButton;<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>type<br> &nbsp;TWindowInfo = record<br> &nbsp; &nbsp;Handle:LongWord; &nbsp;//窗口句柄<br> &nbsp; &nbsp;ClassStr:String; &nbsp;//窗口类<br> &nbsp; &nbsp;Caption:String; &nbsp; //窗口标题<br> &nbsp;end;<br><br>var<br> &nbsp;List: Array of TWindowInfo;<br><br>//-------------------------------------------<br>function StrCmp(String1, String2: string): boolean; &nbsp;//比较两个字符串--不区分大小写<br>begin<br> &nbsp;Result := False;<br> &nbsp;if lstrcmpi(pchar(String1), pchar(String2)) = 0 then Result := True;<br>end;<br><br>function GetCaption(const hWnd: LongWord): string;<br>var<br> &nbsp;szWindowText: array[0..MAX_PATH] of Char;<br> &nbsp;szTextLength: Integer;<br>begin<br> &nbsp;szTextLength := SendMessage(hWnd, WM_GETTEXT, MAX_PATH, Integer(@szWindowText[0]));<br> &nbsp;szWindowText[szTextLength] := #0;<br> &nbsp;Result := szWindowText;<br>end;<br><br>function GetClassStr(const hWnd: LongWord): String;<br>var<br> &nbsp;szWindowClass: array[0..MAX_PATH] of Char;<br>begin<br> &nbsp;GetClassName(hWnd,szWindowClass,Sizeof(szWindowClass));<br> &nbsp;Result := szWindowClass;<br>end;<br>//-----------------------------------------------------------------------<br><br>function EnumPIDWindows(WinHwnd: LongWord; Param: LongWord): Boolean; stdcall;<br>var<br> &nbsp;PID:dword;<br>begin<br> &nbsp;if WinHwnd=0 then<br> &nbsp;begin<br> &nbsp; &nbsp;Result:=False;<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;GetWindowThreadProcessId(WinHwnd,@PID);<br> &nbsp;if Param=PID then<br> &nbsp;begin<br> &nbsp; &nbsp;SetLength(List, Length(List) + 1);<br> &nbsp; &nbsp;List[High(List)].Handle:=WinHwnd;<br> &nbsp; &nbsp;List[High(List)].ClassStr:=GetClassStr(WinHwnd);<br> &nbsp; &nbsp;List[High(List)].Caption:=GetCaption(WinHwnd);<br> &nbsp;end;<br> &nbsp;Result:=True;<br>end;<br><br>function GetProessID(PressName:String):dword;<br>var<br> &nbsp;Process32: TProcessEntry32;<br> &nbsp;ProcessSnapshot: THandle;<br>begin<br> &nbsp;Result:=0;<br> &nbsp;ProcessSnapshot := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);<br> &nbsp;Process32.dwSize := SizeOf(TProcessEntry32);<br> &nbsp;Process32First(ProcessSnapshot, Process32);<br> &nbsp;repeat<br> &nbsp; &nbsp;if StrCmp(PressName,Process32.szExeFile)then &nbsp;//Result:=Process32.th32ProcessID; //判断进程名-不区分大小写~<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;Result:=Process32.th32ProcessID;<br> &nbsp; &nbsp; &nbsp;SetLength(List, 0);<br> &nbsp; &nbsp; &nbsp;EnumWindows(@EnumPIDWindows,Process32.th32ProcessID);<br> &nbsp; &nbsp;end;<br> &nbsp;until not (Process32Next(ProcessSnapshot, Process32));<br> &nbsp;CloseHandle(ProcessSnapshot);<br>end;<br><br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;I:Integer;<br>begin<br> &nbsp;Form1.Caption:='进程句柄:'+IntToStr(GetProessID(Edit1.Text));<br> &nbsp;if GetProessID(Edit1.Text)&gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;Form1.Caption:=Form1.Caption+',窗口数量:'+IntToStr(Length(List));<br> &nbsp; &nbsp;if Length(List)=0 then Exit;<br> &nbsp; &nbsp;ListBox1.Items.Clear;<br> &nbsp; &nbsp;for I:=Low(List) to High(List) do<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;ListBox1.Items.Add('窗口句柄:'+IntToStr(List[I].Handle)+',窗口类名:'+List[I].ClassStr+',窗口标题:'+List[I].Caption);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;<br><br>end.<br>
 
谢谢xiaoxinya的建议,我已经按你的意思做了一下,但没有成功,<br>不好意思 可能是我没有讲清楚我的环境,我是在写一个windows服务程序。<br>另外我还要写一个对这个服务的做监控的程序。<br>所以我想用服务对我的监控程序发消息的方式 来相互通讯。<br>但现在无论我是用findwindows或是xiaoxinya的窗口枚举方法,<br>都没有成功找到我的监控程序的句柄。我也试过用postmessage(HWND_BROADCAST,WM_MSG,wparam,lparam);广播来发消息,也没有成功。<br>会不会服务程序就不可以对外发消息?
 
xiaoxinya,不好意思,你的方法我测试成功了。第一次我把process name传错了。呵呵送分了
 
谢谢 xiaoxinya 送上100分
 
另外我发现其实 使用 findwindowsex也可以找到,呵呵,绕了半天似乎又回到原来的点上了。呵呵
 
后退
顶部