MrFooL 发表于 2024-5-2 13:16

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;
                }
            }
      }

}
}



求助各位大佬,应该如何修改代码才能达到我想要的效果

爱飞的猫 发表于 2024-5-3 17:45

hook 建立窗口的函数(CreateWindowExA/W 等,需要分析程序代码看它用了哪个),建立窗口时更改传递的参数或建立后拿 hwid 让其隐藏。

页: [1]
查看完整版本: c++中使用dll侧载如何隐藏主窗体