当前位置:主页>delphi源码/MIS软件> 文章内容

请教如何使用DBGrid灵活显示一个表的部分字段

发布时间:2010-01-20 | QQ免费站
1楼: 我用的是GetActiveWindow与GetWindowText来取得活动窗口与标题,也写成了DLL,但是它就是只能取得自己的窗口标题,而不能取得其它活动窗口的标题,例如我现在用写字板或是打开网页等,这些都取不到,急,请高手帮忙呀!!

字串1

2楼: 用GetForegroundWindow来试试 字串9

3楼: 一样的结果

字串1

4楼: 你的程序不会在做这些动作前把自己ACTIVE了吧? 为何要用DLL呢? 我便用这一句便取到了 GetWindowText(GetForegroundWindow(), @pcaption[1], 128);

字串6

5楼: 我试一下,多谢了

字串8

6楼: to someset 还是有问题,当我的程序用Application.ShowMainForm := False;隐藏起来时,程序就取不到窗口标题了, 我是把窗口标题定时写入文件的 字串7

7楼: 用个timer,随时写文件,然后把自己程序最小化,应该就可以了
字串2

8楼: 我是用了个timer定时写文件,但是当自己的程序窗口隐藏时,它就好像取不到窗口标题一样了,我的是要做成一个后台程序

字串3

9楼: 真的吗你说的我试试先 字串6

10楼: 你的意思是,只要窗口一隐藏timer的事件就不执行了吗?这可需要好好研究一下了,要是作个后台程序吗》?那就写到线程里好了

字串9

11楼: 如果用Timer的话,天知道用户会多长时间切换一次窗体呢。如果在两次Timer之间切换窗体的话,就获取不到了。如果用户长时间不切换窗体,又会多次取相同的标题。 楼主如果要求的是只要有窗体被切换到前台,则获取窗体的标题,并记录的话。建议用全局的Hook做。 字串7

12楼: 没有啊,我的一切正常,HIDE后也一样 另外注意调用参数用array of char,而不用string[] 字串6

13楼: 我用的两句代码 GetWindowText(GetForegroundWindow(), @cap[1], 128); ShowMessage(string(cap)); 间隔5秒 切换到任何地方均可弹出工作窗口标题。 字串2

14楼: someset,hys_peter,不好意思,浪费你们时间了,是我犯了个错,能写,不过这样好像取不到一些应用程序的Hint信息,再就是会取到重复的标题。

字串7

15楼: hook?挂WH_CBT(是一个基于计算机钩子调用,发生在激活、创建、关闭、最小化、最大化、移动或改变一个窗口的大小之前,在完成一个系统命令、清除一个鼠标或者键盘事件、设置焦点,以及在同步系统消息队列之前)类型? 字串1

16楼: 是,只要截取HCBT_ACTIVATE就行,
字串5

17楼: HOOK 用SHELL HOOK就可以啊,能在任务栏有变动时拦截
字串6

18楼: to someset: 前辈,发个例子看看吧,shell hook早就久仰了,可是没有实用过,msdn上也没个delphi例子,是不是和普通钩子一样呢?有什么区别吗? 字串8

19楼: 刚开始我就是用的Dll,但是好像只能取要自己窗口的,下面是我的DLL,麻烦你们帮我看一下,是哪里的问题 Tcallbackfun=procedure(info:pchar); TWinTitlehook=record isrun:boolean; hook:hhook; callbackfun:Tcallbackfun; end; var myWinTitlehook:TWinTitlehook; {$R *.res} function gethookinfo(code:integer;wp:WPARAM;lp:LPARAM):LResult;stdcall; var FileName, Info:string; Buffer: array[0..128] of char; F: TextFile; begin if code<0 then begin result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp); exit; end; info:=‘‘; FillChar(Buffer, sizeof(Buffer), #0); if GetWindowText(GetForegroundWindow(),Buffer, 255)>0 then begin try FileName := ‘E:\Filelog.txt‘; AssignFile(F, FileName); if FileExists(FileName) then Append(F) else Rewrite(F); Writeln(F,Buffer); Info := StrPas(Buffer); finally CloseFile(F); end; end; info := Info + ‘Size‘ + IntToStr(SizeOf(info)); myWinTitlehook.callbackfun(pchar(info)); result:= CallNextHookEx(myWinTitlehook.hook,code,wp,lp); end; procedure installmousehook(callbackF:Tcallbackfun); stdcall; begin if not myWinTitlehook.isrun then begin myWinTitlehook.hook:=setwindowshookex(WH_CBT,@gethookinfo,HInstance,0); myWinTitlehook.callbackfun :=callbackf; myWinTitlehook.isrun:=not myWinTitlehook.isrun; end; end; procedure uninstallmousehook(); stdcall; begin if myWinTitlehook.isrun then begin UnHookWindowsHookEx(myWinTitlehook.hook); myWinTitlehook.callbackfun :=nil; myWinTitlehook.isrun:=not myWinTitlehook.isrun; end; end; 字串7

20楼: 嘿嘿还真是头一回被人叫做前辈:D SHELL HOOK我只是在很久很久以前用过一次(真的很久了:) 用的VC,我找找看
字串6

21楼: vc最好,我觉得要是研究一下windows机制还是vc比较好
字串4

22楼: 我的邮箱是houys@sunv.com 谢谢了

字串5

23楼: 各位,帮我看看好不好?麻烦了 字串8

24楼: 其实VC、delphi都无所谓,仔细翻翻MSDN,Windows的东西差不多就都清楚了。 to student.dai 全局的Hook是将dll注入不同的程序,这样等于需要完成程序之间传递字符串。需要建立一块共享的数据区。并在注入的Dll中建立共享数据区的镜像。 字串7

25楼: 这好像无所谓 GetWindowText会将标题字串拷贝到所在进程内 不过看得还是不大明白。会不会是writeln的问题?把它用string()转换一下试试
字串6

26楼: 看错了,没注意你是直接在dll中写文件的:(,在看看。 字串2

27楼: 多谢各位,我还得再看看书,如果你们好的例子给我一个行不? 字串2

28楼: 多人接受答案了。
字串4

29楼: installmousehook的时候,传入的Tcallbackfun是主程序的过程么? 字串4

30楼: to hys_peter 发送邮件了
字串9