请教如何使用DBGrid灵活显示一个表的部分字段
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