小弟问个MFC问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小弟问个MFC问题相关的知识,希望对你有一定的参考价值。

我创建MFC对话框,开始的时候显示一个非模态对话框A,A可以通过按钮显示非模态对话框B,但是B显示出来时这两个窗口看起来有父子窗口的联系(激活B窗口A窗口被遮挡,但是激活A窗口,A仍然被B遮挡,除非最小化B),这个怎么解决.
显示A用的 a->create(IDD_ABC);a->showwindow(SW_SHOW);B用的相同办法

你把a和b的实例都在主DLG中创建。

显示的时候调用
pmain->a->showwindow(SW_SHOW);
pmain->b->showwindow(SW_SHOW);
参考技术A 没明白你说什么.可能我理解能力不行.能再详细点吗?比如把代码帖出来.
补充:
m_d1.Create(IDD_DIALOG1,this);
m_d1.ShowWindow(SW_SHOW);
还有,把你对话框的类型都设置为CHILD,BORDER也设置成NONE类型.
你的A窗口被创建了,然后你点A窗口里的按钮,在A窗口创建出了B,这样,B就是A的子窗口了.一定是把A遮挡了.要想不让B总挡住A,用下边的方法:
在A下方就是B挡不到的地方,放置一个按钮,然后在按钮的单击事件中.让B.showwindow(sw_hide);这样B行了.
参考技术B 你说的不清不楚,我也不明白什么意思
这个方法你试试吧,在按钮事件里添加一句
b->SetParent(NULL);
意思是设置父窗口为空
参考技术C 我的天呐,B是模态对话框那,
当然会出现这种现象了
如果按照楼下的说法的话,只是把父窗口给隐藏了,也打不到的你的那个要求。
仔细分析一下了。
学东西不能什么都问,做好事别人给点提示自己就能解决,进步的做好方法。
加油~~

MFC/VC++进程自我保护(通过远程线程注入或HOOK)

就是令进程本身无法被关闭或者一关闭就重启,请知道的大侠们不吝赐教,写过的同学把代码贴给小弟看看,谢谢

//dll 代码:
#include <windows.h>

char pNew[8] = 0;
char pOld[8] = 0;

HMODULE hModu = NULL;
DWORD dwOldApi = 0;

void HookApiOn(char* pDllName, char* pApiName,FARPROC pFunc)

DWORD dwOld = 0;
DWORD flag = 0;
hModu = LoadLibrary(pDllName);
dwOldApi = (DWORD)GetProcAddress(hModu,pApiName);

VirtualProtect((LPVOID)dwOldApi,5,PAGE_READWRITE,&dwOld);

char*p = (char*)dwOldApi;
DWORD dd = (DWORD)pFunc - dwOldApi -5 ; //jmp lebel:5个字节
pNew[0] = 0xE9;
*(DWORD*)&(pNew[1]) = dd;
ReadProcessMemory(GetCurrentProcess(),(LPVOID)dwOldApi,(LPVOID)pOld,5,&flag);
//memcpy((void*)pOld,(const void*)dwOldApi,5);

WriteProcessMemory(GetCurrentProcess(),(LPVOID)dwOldApi,(LPVOID)pNew,5,&flag);
VirtualProtect((LPVOID)dwOldApi,5,dwOld,NULL);
return ;


void HookApiOff()


DWORD dwOld = 0;
DWORD flag = 0;

VirtualProtect((LPVOID)dwOldApi,5,PAGE_READWRITE,&dwOld);
WriteProcessMemory(GetCurrentProcess(),(LPVOID)dwOldApi,(LPVOID)pOld,5,&flag);
VirtualProtect((LPVOID)dwOldApi,5,dwOld,NULL);

return ;


void _stdcall my_MessageBoxW( HWND hWnd ,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)

HookApiOff();
if(IDNO == MessageBoxW(NULL,L"程序非法调用了MessageBoxW函数,是否阻止?",L"提示",MB_YESNO))
MessageBoxW(hWnd,lpText,lpCaption,uType);
HookApiOn("user32.dll","MessageBoxW",(FARPROC)my_MessageBoxW);


void InstallAllHook()

HookApiOn("user32.dll","MessageBoxW",(FARPROC)my_MessageBoxW);

return ;


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)


switch(ul_reason_for_call)

case DLL_PROCESS_ATTACH:
InstallAllHook();
break;


return TRUE;

//.exe实现进程注入的代码:<此处注入到任务管理器中>
#include <windows.h>
#include <stdio.h>

#define Dll_Name "F:\\workspqce\\Jmp_Hook\\Debug\\jmp_dll.dll"

BOOL EnablePrivilege()

HANDLE hToken = NULL;

if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))

TOKEN_PRIVILEGES tkp= 0;

LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );



return FALSE;


BOOL InjectDll(DWORD dwProcessId)

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
if(!hProcess)
return FALSE;

LPVOID pszDllName = VirtualAllocEx(hProcess,NULL,strlen(Dll_Name)+1,MEM_COMMIT,PAGE_READWRITE);
if(!pszDllName)
return FALSE;

if(!WriteProcessMemory(hProcess,pszDllName,Dll_Name,strlen(Dll_Name),NULL))
return FALSE;

PTHREAD_START_ROUTINE tsr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryA");
if(!tsr)
return FALSE;

HANDLE hRemote = CreateRemoteThread(hProcess,NULL,0,tsr,pszDllName,0,NULL);
if(!hRemote)
return FALSE;

WaitForSingleObject(hRemote,INFINITE);
VirtualFreeEx(hProcess,pszDllName,strlen(Dll_Name)+1,MEM_RELEASE);

return true;


int main()

DWORD dwProcessId = 0;

HWND hWindow = FindWindow(NULL,"Windows 任务管理器");
GetWindowThreadProcessId(hWindow,&dwProcessId);

if(EnablePrivilege())
InjectDll(dwProcessId);
return 0;
参考技术A 使用全局钩子, 勾住ExitProcess/TerminateProcess API 。 判断进程ID,使之无效就可以了。 参考技术B 给进程设定看门狗

以上是关于小弟问个MFC问题的主要内容,如果未能解决你的问题,请参考以下文章

问个问题

MFC关于Radio Button控件的问题 高分悬赏!!敬请指点

VIRTUEMART退出问个问题。。。。

问个oracle sql问题

我想问个问题,怎么用CSS定义每张图片旋转90°输出?

问个JAVA控件位置放置问题