c++中使用dll侧载如何隐藏主窗体
求助各位大佬,目前需求是使用dll侧载,当主程序1.exe加载1.dll时,dll使用ShowWindow(Hwnd, SW_HIDE);隐藏窗体。ps:1.exe没有源码,不能使用参数传递。目前问题是dll无法获取到主窗体的句柄,加载dll时窗体还未完成加载(Hwnd为空),导致隐藏失败。
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
HWND hWnd = GetConsoleWindow();
if (hWnd != NULL) {
ShowWindow(hWnd, SW_HIDE);
}
}
}
然后尝试使用死循环的方式不断查找窗体,直到找到符合条件的窗体句柄就隐藏。(代码写在单独的程序里测试没问题,打开指定窗口就会被隐藏)
但如果写在dll里,这样会导致主程序死锁。。窗体压根就没加载就没办法执行后面的代码了。
struct window
{
HWND hd;
wstring caption;
};
int wnum = 0;
window windows{};
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
TCHAR Caption{};
GetWindowText(hWnd, Caption, 200);
switch (lParam)
{
case 0:
case 3:
if (IsWindowVisible(hWnd) && (GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) != WS_EX_TOOLWINDOW && GetWindowLong(hWnd, GWLP_HWNDPARENT) == 0)
break;
else
return TRUE;
case 1:
if (wcscmp(Caption, TEXT("")) == 0)
return TRUE;
break;
case 2:
break;
}
++wnum;
if (wnum == 1001)
{
return FALSE;
}
windows.caption = Caption;
windows.hd = hWnd;
return TRUE;
}
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
bool isShow = TRUE;
while (isShow)
{
wnum = 0;
EnumWindows(EnumWindowsProc, 0);
for (int i = 1; i <= wnum; ++i)
{
HWND WindowHwnd = NULL;
if (windows.caption == L"testName")//找到指定窗体名
{
WindowHwnd = windows.hd;
ShowWindow(WindowHwnd, SW_HIDE);//隐藏
isShow = FALSE;
break;
}
}
}
}
}
求助各位大佬,应该如何修改代码才能达到我想要的效果
hook 建立窗口的函数(CreateWindowExA/W 等,需要分析程序代码看它用了哪个),建立窗口时更改传递的参数或建立后拿 hwid 让其隐藏。
页:
[1]