高分请教,Hook到窗口显示消息后,怎么让窗口不可见,并且不显示任务栏图标?

wts 2008-10-21 12:26:55
我Hook了WH_CALLWNDPROC消息,并且在Hook方法中拦截WM_SHOWWINDOW,从而拦截窗口显示消息
我想拦截窗口显示消息之后,控制窗口不可见,并且不显示任务栏图标。
1、我尝试用ShowWindow(hwnd,SW_HIDE);
但这样会导致又发送新的WM_SHOWWINDOW消息,并被我的Hook方法拦截,好像进入递归循环一样,这个方法不行。
2、我尝试SendMessage发送WM_SHOWWINDOW消息.....,与1的效果一样,也不行
3、 targetStyle := getWindowLong(Hwnd, GWL_EXSTYLE);
targetStyle := targetStyle or $80000;
SetWindowLong(winStruct.Hwnd, GWL_EXSTYLE, targetStyle or WS_EX_TOOLWINDOW);
SetLayeredWindowAttributes(Hwnd, 0, 0, 2);//窗口透明
发现窗口虽然透明不可见,但任务栏图标依然存在。注释掉窗口透明代码,发现窗口已经变成工具窗口,但却依然显示最大化最小化按钮残像。通过对窗口最小化和恢复可以观察到。
4、我尝试
targetStyle := SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_HIDEWINDOW;
setwindowpos(Hwnd, hwnd_top, 0, 0, 100, 100, targetStyle);
发现在这个代码无效。但在一个普通程序中,对于一个已经显示的窗口测试,发现是有效的。我想原因就是setwindowpos只对已经显示的窗口有效,而我在Hook过程中使用时,目标窗口还没有显示出来,所以无效。
5、听说还有一种办法,是将目标窗口在一个虚拟桌面中显示。但对于我这里不太使用,因为我还要根据窗口的一些运行情况,将其恢复到当前桌面显示。

我这里并不是一个简单隐藏窗口的问题。
大家看看,还有什么好办法,能达到我要的效果?
另外,不懂的,不能回答的,就别顶了,我会自己关注帖子,自己提前的,谢谢合作。


...全文
1158 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
wts 2008-10-28
  • 打赏
  • 举报
回复
我不认识jzcdelphi,我可懒得弄传说中的马甲,不浪费自己生命么
OK,基本明白了。有时间还得好好体会一下你前面隐藏的原理和细节,还得好好学习一下子类化的知识。
wts 2008-10-28
  • 打赏
  • 举报
回复
不是一个人。我不认识他
dandycheung 2008-10-28
  • 打赏
  • 举报
回复
恢复显示不能像你说的那样子做。因为我的代码里在处理完第一条 WM_WINDOWPOSCHANGING 消息之后就把人家的窗口过程恢复回去了,这也就意味着,你已经不再接管目标窗口的消息处理了。但是别忘了,你可以把窗口句柄留着,恢复显示的时候直接调用 ShowWindow 就够了。

晕,原来 wts 和 jzcdelphi 是一个人?
wts 2008-10-28
  • 打赏
  • 举报
回复
哦,原来这中做法就叫子类化。谢谢了。
不结贴,不就是等你最后再多教我们我点知识嘛,呵呵
结贴怕你就不告诉我了。

看你主要都是在VC板块,原来Delphi也这么厉害。佩服。

我上面说的隐藏之后,恢复显示的想法对吗?
我这就结贴,希望结贴后你能再指点一二。
dandycheung 2008-10-28
  • 打赏
  • 举报
回复
没问题,不过不知道为什么楼主不结贴呢?

开始的思路是在钩子里直接处理,但是经证实不能生效;所以就只好子类化目标窗口了,让目标窗口自己去处理这个消息,处理完毕后把前面的子类化恢复。
jzcdelphi 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 jzcdelphi 的回复:]
很奇怪的是,我把里面的Notepad,改成其它的进程的名字,就不行了,这是为什么呢?
[/Quote]

明白了,原来是类名

我也想知道这段代码的实现原理,不知先辈能不能讲解一下.?
wts 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 jjh1260 的回复:]
MARK一下,貌似写木马时候,隐藏打开IE,ASP格式发信可以使用,楼主有同样想法不?
[/Quote]
当然不是这样的想法。
你有把小刀,想去抢劫,而我有把小刀,只是想削几个苹果。
wts 2008-10-27
  • 打赏
  • 举报
回复
to dandycheung:
你提供的代码很好用,谢谢。
能讲讲原理吗?
我感觉好像是将目标窗口的消息处理函数替换为WindowProc,并当wndPos^.flags and SWP_SHOWWINDOW的时候,就丢弃该窗口的SWP_SHOWWINDOW消息。
是这样吗?

另外隐藏之后,如果我想再让其恢复显示,应该怎么做呢?能再大体讲下过程吗?
是不是
SetWindowLong(winPos.hwnd, GWL_WNDPROC, oldWndProc);即可?

非常感谢。
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
这时工程1.exe就会假死,系统也变得缓慢.这时用任务管理器,结束工程1.exe无效,只能结束
delphi32才会,结束后,系统正常
如果单独运行编译好的工程.exe文件,运行后,也会有一个错误提示,但运行记事本程序,界面被成功隐藏


不知,到底哪里出错了?
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
编译dll时出现
[Hint] ShowHook.dpr(52): Variable 'str' is declared but never used in 'ShowHookProc'

调用部分
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function Hook:Boolean;stdcall;External'ShowHook.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
Hook;
end;

end.
编译通过,但只要按下按钮1,就出现debugger exce..的错误提示
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
你的调用代码是怎么写的?包括引用部分?
dandycheung 2008-10-26
  • 打赏
  • 举报
回复
我的测试程序没有出现这种问题。
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
这段代码,我编译dll后,调用时报错,并且系统和程序会有假死现像
但运行记事本,确实,可以隐藏窗口,只不过,过不一会儿,程序和系统就假死了,必须手动结束
delphi32和工程1程序!
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
很奇怪的是,我把里面的Notepad,改成其它的进程的名字,就不行了,这是为什么呢?
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
又试了一下,现在可以了,代码没有问题,是我没调用明白!
谢谢先辈 
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
而且我还特意和你说“有参数”。难道你不会调用有参数的过程?

没这么用过,第一次,所以不知怎么调用?
dandycheung 2008-10-26
  • 打赏
  • 举报
回复
楼上的小兄弟,我真是替你难过啊,眼睛稍微睁大点就能看到我的过程的原型:
procedure Hook(bEnable: Boolean); stdcall;

而且我还特意和你说“有参数”。难道你不会调用有参数的过程?

那个 str 未使用的警告当然会有了,因为我把使用它的代码用预编译指令注释掉了。
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure Hook ;stdcall;External'ShowHook.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
Hook;
end;

end.

我这样调用,也还是也同样的错误,到底你是怎么调用的?
jzcdelphi 2008-10-26
  • 打赏
  • 举报
回复
请你帮给出正确的调用?
另外
编译dll时出现
[Hint] ShowHook.dpr(52): Variable 'str' is declared but never used in 'ShowHookProc'
这个是什么,你的也有吗?
dandycheung 2008-10-26
  • 打赏
  • 举报
回复
你的问题出在哪里我不太清楚,不过我的 Hook 明显是个过程,有参数但没有返回值,而你的申明和调用明显和我的原型不符……
加载更多回复(41)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧