当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何在其他程序的窗口上创建按钮并使之能响应

VC++
如何有效地使用对话框
一个定制CFileDialog对话框的实例
XP风格复活节彩蛋的实现
程序界面多模式显示的实现
改变视图单调的背景
使窗体拥有透明效果的API
《电子尺》V1.02程序开发实例
美化你的应用程序的外观界面
个人考勤软件开发实例
使用VC6.0实现窗口的任意分割
如何让一个打开的文档成为活动文档
创建非矩形窗口的简单方法
轻松实现类VC界面
视图的缩放的完整论述
如何获得另一个应用程序窗口中的文本
如何发送命令到文档对象
动画窗口的实现-VC++实例一则
如何在其他程序的窗口上创建按钮并使之能响应
如何在基于对话框的程序中动态设置鼠标指针
扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

VC++ 中的 如何在其他程序的窗口上创建按钮并使之能响应


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 104 ::
收藏到网摘: n/a


如何在其他程序的窗口上创建按钮并使之能响应
作者:ac952_z_cn

源代码下载

环境:Windows NT/2000

实现方法:采用将动态连接库注入到其他进程中的方法来实现。

    为了便于选择窗口,我借用了另一个程序"2000下显示带*号"来选择窗口。
如果要在98下实现你可用钩子同样实现。
程序运行界面如图一:
图一
将动态连接库注入其他进程的代码如下:
BOOL WINAPI RT_CTRL_BTN(LPCSTR lpszLibFile, HWND hWnd, DWORD dwID, LPRECT pRtBtn, LPCTSTR szCaptionBtn){	try {	DWORD dwProcessID;	GetWindowThreadProcessId(hWnd, &dwProcessID);	HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |	PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, dwProcessID );	if (!hProcess){	return FALSE;	}	INJECT_DLL InjectInfo;	InjectDLL_Info(&InjectInfo, lpszLibFile, hWnd, dwID, pRtBtn, szCaptionBtn);	LPBYTE lpThreadAddr=(LPBYTE)::VirtualAllocEx(hProcess, NULL, MAXINJECTSIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);	LPINJECT_DLL param = (LPINJECT_DLL) VirtualAllocEx( hProcess, 0, sizeof(INJECT_DLL), MEM_COMMIT, PAGE_READWRITE );	WriteProcessMemory(hProcess, lpThreadAddr,&RemoteControlThread,	MAXINJECTSIZE, 0);	WriteProcessMemory( hProcess, param, &InjectInfo, sizeof(InjectInfo), 0 );	DWORD dwThreadId;	HANDLE hThread = ::CreateRemoteThread(hProcess,NULL,0,	(unsigned long (__stdcall *)(void *))lpThreadAddr,	param, 0, &dwThreadId);	if (!hThread){	CloseHandle(hProcess);	VirtualFreeEx( hProcess, lpThreadAddr, 0, MEM_RELEASE );	VirtualFreeEx( hProcess, param, 0, MEM_RELEASE );	return FALSE;	}	else {	CloseHandle(hThread);	CloseHandle(hProcess);	VirtualFreeEx( hProcess, lpThreadAddr, 0, MEM_RELEASE );	VirtualFreeEx( hProcess, param, 0, MEM_RELEASE );	}	}	catch (...){	return FALSE;	}	return TRUE;}
环境:win2000 professional + VC6.0+SP5 + PlatformSDK 2001.8