c++ - 是否可以全局挂接窗口的创建,以便我可以控制窗口在屏幕上的放置位置?

标签 c++ winapi

我可以将一个钩子(Hook)注入(inject)正在运行的进程中,以捕获它们何时创建、销毁、最大/最小。但我还没有想出一种方法来捕获新进程的创建,以便我可以将我的钩子(Hook)注入(inject)到该进程中。 有谁知道实现此目标的最佳方法吗?

最佳答案

SetWindowsHookEx是您最简单的解决方案。

如果您不介意扰乱防病毒软件,您还可以将 DLL 注入(inject)到每个进程中,然后该进程将 Hook CreateProcess(将 DLL 注入(inject)到其他进程中)和 CreateWindowEx(用于您的目的)。

编辑:我刚刚完整阅读了你的问题。是的,您只需 Hook CreateProcessW 并将您的 Hook 注入(inject)到 future 的进程中。

编辑#2:我昨天实际上正在研究类似的事情,所以一些代码可以满足您的要求。

#include <windows.h>

// call GetModuleFileNameto get the full path of the module before installing the hook
static LPWSTR lpszDllName;

HMODULE LoadModuleEx(__in HANDLE hProcess, __in_z LPCTSTR lpcszDll)
{
  DWORD   cdwSize;
  LPVOID  lpvAllocation;
  HANDLE  hThread;
  HMODULE hRet;

  cdwSize = lstrlen(lpcszDll) + 1;
  cdwSize *= sizeof(TCHAR);

  lpvAllocation = VirtualAllocEx(hProcess, NULL, cdwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if (lpvAllocation != NULL)
  {
    if (WriteProcessMemory(hProcess, lpvAllocation, lpcszDll, cdwSize, NULL))
    {
      hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, lpvAllocation, 0, NULL);
      if (hThread != NULL)
      {
        GetExitCodeThread(hThread, (LPDWORD)&hRet);
        CloseHandle(hThread);
      }
    }
    VirtualFreeEx(hProcess, lpvAllocation, cdwSize, MEM_DECOMMIT);
  }
  return hRet;
}

// hook future process creation - install this hook on top of CreateProcessW
// I'd suggest using Microsoft Detours [http://research.microsoft.com/en-us/projects/detours/]
BOOL WINAPI CreateProcessWHook(__in_opt LPCWSTR lpApplicationName, __inout_opt LPWSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCWSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation)
{
  // create the process suspended
  if (dwCreationFlags & CREATE_SUSPENDED != CREATE_SUSPENDED)
    dwCreationFlags |= CREATE_SUSPENDED;

  // call original CreateProcessW
  BOOL bRet = _CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  if (bRet)
  {
    // inject DLL
    LoadModuleEx(lpProcessInformation->hProcess, lpszDllName);

    // resume thread
    ResumeThread(lpProcessInformation->hThread);
  }

  return bRet;
}

关于c++ - 是否可以全局挂接窗口的创建,以便我可以控制窗口在屏幕上的放置位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033356/

相关文章:

c++ - 将 char 存储到指针值中时出现运行时错误

c++ - 检查 ofstream 是否为空?

c - 读取为未缓存的直接 I/O 打开的文件的最后一个 block 不会产生 EOF,正常行为?

c++ - 静态函数中不可访问的非静态成员

c++ - 这里如何正确使用bind?

c++ - 为什么这段代码没有显示 10^5 左右的 n 的输出

c++ - 海湾合作委员会ld : symbol(s) not found for architecture i386

c - TreeView 更改项目图像的颜色

c - 设置静态文本颜色 Win32

winapi - 使用 WIN32 函数在 MASM 中输出 Hello World