麻烦帮我把一段C++代码转为delphi代码。谢了!

my11911 2014-03-02 12:59:31

我想用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++关键代码,更详细请下载参见例程===================================


再次感谢!!!
...全文
156 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
my11911 2014-03-07
  • 打赏
  • 举报
回复
发贴好几天了,有朋友能帮我完成一下吗?多谢了!

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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