我想用delphi 7写一个全局钩子,当窗口标题为“XXXXX”的窗口一生成,就在后台截住它(不要消毁也不要隐藏),然后用Windows.SetParent(Handle1, Handle2)改变它的父窗口,把其父窗口改为某已知句柄的窗口(虚拟桌面),让其显示在虚拟桌面窗口里;在当前桌面就像没看到它们出现一样。
我对钩子不太熟悉,花了好长时间在delphi 7下都不知如何实现。最后找到一个功能较为类似的用C++写的例程,但我对C++不熟,麻烦帮我把其源代码,从C++转为delphi 7。不胜感激!!!
以下是《阻止弹窗程序 弹窗免疫程序》C++程序(内含代码):
http://download.csdn.net/detail/luo_xuewu/2730015
上面网址需要积分才可下载,所以我把它上传到了百度网盘,你可以到百度网盘下载:
http://pan.baidu.com/s/1nb3WU
特别注意:
1、C++例程代码是直接阻止窗口显示,译成DELPHI代码后,请用注释注掉阻止显现的代码,改为用Windows.SetParent(Handle1, Handle2)改变它的父窗口即可。
2、C++例程代码阻止的是对话框,而我要阻止的窗口由那个进程产生的并不知晓,唯一知道的只是窗口的标题为“XXXXX”,该窗口有可能是对话框,也有可能是某个进程产生的窗口。
另附delphi全局钩子例程:
《Hook到窗口显示消息后,怎么让窗口不可见》:
http://bbs.csdn.net/topics/280005288
(#41 dandycheung的回复很有参考价值,不过他是根据类名阻止窗口,而我要的是根据窗口标题阻止;同时我要的不是隐藏窗口,而是改变父窗口)
//==========以下是C++关键代码,更详细请下载参见例程===================================
DllMain.cpp
#include "windows.h"
#include "Macro.h"
#include "Hook.h"
BOOL WINAPI DllMain( HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved )
{
return true ;
}
//----------------------------------------------------
Macro.h
#ifndef MACRO_H
#define MACRO_H
#define DEBUG
#define NOTUSED 0
#define RESERVED 0
#define IGNORED 0
#ifdef UNICODE
#define tstring wstring
#define tstringstream wstringstream
#define tistringstream wistringstream
#define tostringstream wostringstream
#define tfstream wfstream
#define tifstream wifstream
#define tofstream wofstream
#define CF_TCHAR CF_UNICODETEXT
#else
#define tstring string
#define tstringstream stringstream
#define tistringstream istringstream
#define tostringstream ostringstream
#define tfstream fstream
#define tifstream ifstream
#define tofstream ofstream
#define CF_TCHAR CF_TEXT
#endif
#define UM_CREATE WM_USER + 100
#define UM_TEXT WM_USER + 101
#endif
//----------------------------------------------------
Hook.h
#pragma once
#ifdef DLLEXPORT
#else
#define DLLEXPORT _declspec( dllimport )
#endif
class DLLEXPORT Hook
{
public:
Hook( unsigned int p_HookType, unsigned int p_idThread = 0 );
~Hook(void);
bool SetHook(void);
void UnHook(void);
private:
unsigned int HookType ;
unsigned int idThread ;
HHOOK hook ;
private:
static HWND hwndOwner ;
public:
static bool SetOwner(HWND p_hwndOwner);
static LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
};
//----------------------------------------------------
#define DLLEXPORT _declspec( dllexport )
#include "windows.h"
#include "tchar.h"
#include "Macro.h"
#include "Hook.h"
#pragma data_seg( "HookWnd" )
HWND Hook::hwndOwner = NULL ;
#pragma data_seg()
#pragma comment( linker, "/section:HookWnd,RWS" )
Hook::Hook( unsigned int p_HookType, unsigned int p_idThread )
: HookType( p_HookType )
, idThread( p_idThread )
{
}
Hook::~Hook(void)
{
UnHook();
}
bool Hook::SetOwner(HWND p_hwndOwner)
{
if( !IsWindow( p_hwndOwner ) )
return false;
hwndOwner = p_hwndOwner ;
return true ;
}
bool Hook::SetHook(void)
{
switch( HookType )
{
case WH_CALLWNDPROC :
hook = SetWindowsHookEx( HookType, CallWndProc,
GetModuleHandle( TEXT( "DllScoutCraeteMsg.dll" ) ), idThread ) ;
break;
case WH_GETMESSAGE :
hook = SetWindowsHookEx( HookType, GetMsgProc,
GetModuleHandle( TEXT( "DllScoutCraeteMsg.dll" ) ), idThread ) ;
default:
break ;
}
if( !hook )
return false;
return true ;
}
void Hook::UnHook(void)
{
if( hook )
UnhookWindowsHookEx( hook ) ;
}
LRESULT CALLBACK Hook::CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if( !wParam )
{
CWPSTRUCT *pCwp = reinterpret_cast< CWPSTRUCT* >( lParam );
if( pCwp->message == WM_INITDIALOG )
{
if( SendMessage( hwndOwner, UM_CREATE, wParam,
reinterpret_cast< LPARAM >( pCwp->hwnd ) ) )
return 0 ;
}
}
return CallNextHookEx( IGNORED, nCode, wParam, lParam );
}
LRESULT CALLBACK Hook::GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
MSG *pMsg = reinterpret_cast< MSG* >( lParam ) ;
if( pMsg->message == WM_CHAR )
{
if( hwndOwner != GetParent( pMsg->hwnd ) )
SendMessage( hwndOwner, UM_TEXT, pMsg->wParam, pMsg->lParam ) ;
}
return CallNextHookEx( 0, code, wParam, lParam ) ;
}
//==========以上是C++关键代码,更详细请下载参见例程===================================
再次感谢!!!