S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #1 我用的是GetActiveWindow与GetWindowText来取得活动窗口与标题,也写成了DLL,但是它就是只能取得自己的窗口标题,而不能取得其它活动窗口的标题,例如我现在用写字板或是打开网页等,这些都取不到,急,请高手帮忙呀!!
我用的是GetActiveWindow与GetWindowText来取得活动窗口与标题,也写成了DLL,但是它就是只能取得自己的窗口标题,而不能取得其它活动窗口的标题,例如我现在用写字板或是打开网页等,这些都取不到,急,请高手帮忙呀!!
S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #2 我用的是GetActiveWindow与GetWindowText来取得活动窗口与标题,也写成了DLL,但是它就是只能取得自己的窗口标题,而不能取得其它活动窗口的标题,例如我现在用写字板或是打开网页等,这些都取不到,急,请高手帮忙呀!!
我用的是GetActiveWindow与GetWindowText来取得活动窗口与标题,也写成了DLL,但是它就是只能取得自己的窗口标题,而不能取得其它活动窗口的标题,例如我现在用写字板或是打开网页等,这些都取不到,急,请高手帮忙呀!!
S someset Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #5 你的程序不会在做这些动作前把自己ACTIVE了吧?<br>为何要用DLL呢?<br>我便用这一句便取到了<br>GetWindowText(GetForegroundWindow(), @pcaption[1], 128);
你的程序不会在做这些动作前把自己ACTIVE了吧?<br>为何要用DLL呢?<br>我便用这一句便取到了<br>GetWindowText(GetForegroundWindow(), @pcaption[1], 128);
S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #7 to someset<br> 还是有问题,当我的程序用Application.ShowMainForm := False;隐藏起来时,程序就取不到窗口标题了, 我是把窗口标题定时写入文件的
to someset<br> 还是有问题,当我的程序用Application.ShowMainForm := False;隐藏起来时,程序就取不到窗口标题了, 我是把窗口标题定时写入文件的
H hys_peter Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #8 用个timer,随时写文件,然后把自己程序最小化,应该就可以了
S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #9 我是用了个timer定时写文件,但是当自己的程序窗口隐藏时,它就好像取不到窗口标题一样了,我的是要做成一个后台程序
H hys_peter Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #11 你的意思是,只要窗口一隐藏timer的事件就不执行了吗?这可需要好好研究一下了,要是作个后台程序吗》?那就写到线程里好了
F flamboyant Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #12 如果用Timer的话,天知道用户会多长时间切换一次窗体呢。如果在两次Timer之间切换窗体的话,就获取不到了。如果用户长时间不切换窗体,又会多次取相同的标题。<br>楼主如果要求的是只要有窗体被切换到前台,则获取窗体的标题,并记录的话。建议用全局的Hook做。
如果用Timer的话,天知道用户会多长时间切换一次窗体呢。如果在两次Timer之间切换窗体的话,就获取不到了。如果用户长时间不切换窗体,又会多次取相同的标题。<br>楼主如果要求的是只要有窗体被切换到前台,则获取窗体的标题,并记录的话。建议用全局的Hook做。
S someset Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #13 没有啊,我的一切正常,HIDE后也一样<br>另外注意调用参数用array of char,而不用string[]
S someset Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #14 我用的两句代码<br> GetWindowText(GetForegroundWindow(), @cap[1], 128);<br> ShowMessage(string(cap));<br>间隔5秒<br>切换到任何地方均可弹出工作窗口标题。
我用的两句代码<br> GetWindowText(GetForegroundWindow(), @cap[1], 128);<br> ShowMessage(string(cap));<br>间隔5秒<br>切换到任何地方均可弹出工作窗口标题。
S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #15 someset,hys_peter,不好意思,浪费你们时间了,是我犯了个错,能写,不过这样好像取不到一些应用程序的Hint信息,再就是会取到重复的标题。
H hys_peter Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #16 hook?挂WH_CBT(是一个基于计算机钩子调用,发生在激活、创建、关闭、最小化、最大化、移动或改变一个窗口的大小之前,在完成一个系统命令、清除一个鼠标或者键盘事件、设置焦点,以及在同步系统消息队列之前)类型?
hook?挂WH_CBT(是一个基于计算机钩子调用,发生在激活、创建、关闭、最小化、最大化、移动或改变一个窗口的大小之前,在完成一个系统命令、清除一个鼠标或者键盘事件、设置焦点,以及在同步系统消息队列之前)类型?
F flamboyant Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #17 是,只要截取HCBT_ACTIVATE就行,
S someset Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #18 HOOK 用SHELL HOOK就可以啊,能在任务栏有变动时拦截
H hys_peter Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #19 to someset:<br>前辈,发个例子看看吧,shell hook早就久仰了,可是没有实用过,msdn上也没个delphi例子,是不是和普通钩子一样呢?有什么区别吗?
S student.dai Unregistered / Unconfirmed GUEST, unregistred user! 2005-04-01 #20 刚开始我就是用的Dll,但是好像只能取要自己窗口的,下面是我的DLL,麻烦你们帮我看一下,是哪里的问题<br><br> Tcallbackfun=procedure(infochar);<br><br> TWinTitlehook=record<br> isrun:boolean;<br> hook:hhook;<br> callbackfun:Tcallbackfun;<br> end;<br><br>var<br>myWinTitlehook:TWinTitlehook;<br><br>{$R *.res}<br>function gethookinfo(code:integer;wp:WPARAM;lp:LPARAM):LResult;stdcall;<br>var<br> FileName, Info:string;<br> Buffer: array[0..128] of char;<br> F: TextFile;<br>begin<br> if code<0 then<br> begin<br> result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp);<br> exit;<br> end;<br> info:='';<br> FillChar(Buffer, sizeof(Buffer), #0);<br> if GetWindowText(GetForegroundWindow(),Buffer, 255)>0 then<br> begin<br> try<br> FileName := 'E:/Filelog.txt';<br> AssignFile(F, FileName);<br> if FileExists(FileName) then<br> Append(F)<br> else<br> Rewrite(F);<br> Writeln(F,Buffer);<br> Info := StrPas(Buffer);<br> finally<br> CloseFile(F);<br> end;<br> end;<br> info := Info + 'Size' + IntToStr(SizeOf(info)); <br> myWinTitlehook.callbackfun(pchar(info));<br> result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp);<br>end;<br><br>procedure installmousehook(callbackF:Tcallbackfun); stdcall;<br>begin<br> if not myWinTitlehook.isrun then<br> begin<br> myWinTitlehook.hook:=setwindowshookex(WH_CBT,@gethookinfo,HInstance,0);<br> myWinTitlehook.callbackfun :=callbackf;<br> myWinTitlehook.isrun:=not myWinTitlehook.isrun;<br> end;<br>end;<br> <br>procedure uninstallmousehook(); stdcall;<br>begin<br> if myWinTitlehook.isrun then<br> begin<br> UnHookWindowsHookEx(myWinTitlehook.hook);<br> myWinTitlehook.callbackfun :=nil;<br> myWinTitlehook.isrun:=not myWinTitlehook.isrun;<br> end;<br>end;
刚开始我就是用的Dll,但是好像只能取要自己窗口的,下面是我的DLL,麻烦你们帮我看一下,是哪里的问题<br><br> Tcallbackfun=procedure(infochar);<br><br> TWinTitlehook=record<br> isrun:boolean;<br> hook:hhook;<br> callbackfun:Tcallbackfun;<br> end;<br><br>var<br>myWinTitlehook:TWinTitlehook;<br><br>{$R *.res}<br>function gethookinfo(code:integer;wp:WPARAM;lp:LPARAM):LResult;stdcall;<br>var<br> FileName, Info:string;<br> Buffer: array[0..128] of char;<br> F: TextFile;<br>begin<br> if code<0 then<br> begin<br> result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp);<br> exit;<br> end;<br> info:='';<br> FillChar(Buffer, sizeof(Buffer), #0);<br> if GetWindowText(GetForegroundWindow(),Buffer, 255)>0 then<br> begin<br> try<br> FileName := 'E:/Filelog.txt';<br> AssignFile(F, FileName);<br> if FileExists(FileName) then<br> Append(F)<br> else<br> Rewrite(F);<br> Writeln(F,Buffer);<br> Info := StrPas(Buffer);<br> finally<br> CloseFile(F);<br> end;<br> end;<br> info := Info + 'Size' + IntToStr(SizeOf(info)); <br> myWinTitlehook.callbackfun(pchar(info));<br> result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp);<br>end;<br><br>procedure installmousehook(callbackF:Tcallbackfun); stdcall;<br>begin<br> if not myWinTitlehook.isrun then<br> begin<br> myWinTitlehook.hook:=setwindowshookex(WH_CBT,@gethookinfo,HInstance,0);<br> myWinTitlehook.callbackfun :=callbackf;<br> myWinTitlehook.isrun:=not myWinTitlehook.isrun;<br> end;<br>end;<br> <br>procedure uninstallmousehook(); stdcall;<br>begin<br> if myWinTitlehook.isrun then<br> begin<br> UnHookWindowsHookEx(myWinTitlehook.hook);<br> myWinTitlehook.callbackfun :=nil;<br> myWinTitlehook.isrun:=not myWinTitlehook.isrun;<br> end;<br>end;