gpt4 book ai didi

c++ - 查找窗口并更改其名称

转载 作者:可可西里 更新时间:2023-11-01 11:48:53 28 4
gpt4 key购买 nike

我正在尝试做的是一种通过进程 ID 找到窗口的方法,获取该窗口的名称并将其更改为我想要的名称。

我发现了一些关于它的东西:(代码 1)

 int WINAPI GetWindowText(
_In_ HWND hWnd,
_Out_ LPTSTR lpString,
_In_ int nMaxCount
);

这个:(代码 2)

    CWnd* pWnd = GetDlgItem(); GetDlgIt
pWnd->SetWindowText(_T("WindowName"));


CString str;
pWnd->GetWindowText(str);
ASSERT(str == _T("WindowName"));

还有这个(代码3)

    HWND WindowHandel = FindWindowA(0, "WindowName"); 

DWORD proccesID = 0

GetWindowThreadProcessId(WindowHandel, &proccesID);

我的问题是:我怎样才能获得进程 ID,获得该进程的窗口名称,这样代码就可以将 Hwnd 识别为我的窗口名称并将其更改为我想要的名称。像这样:

Process = "anyprocess.exe"
Get Process ID <
Process ID = 1234567
Get window name from the ProcessID we have <
Window name = "ILoveYou"
Change "ILoveYou" to "IHaveYou"

如果我有多个同名窗口,有一种方法可以检查第一个打开的窗口,这样我就不会更改其他窗口吗?

在我看来,从进程 ID 中获取 WindowName 似乎更安全,问题是我不想对代码说我知道窗口名称,我希望它能找到它并像 Liam Neeson 一样更改它对付那些坏人。

而且我还想知道更多关于使用那些“(0,....”或“(NULL,....”的信息,“FindWindowA”命令只是一个例子,我总是看到这个并且不要不知道如何正确使用它:

    FindWindowA(0, "WindowName")

我想要的例子会对我有很大帮助 =)感谢您的耐心等待。

最佳答案

不,这是不可能的。多个窗口可以具有相同的 PID。

但是,假设目标应用程序是单线程的,只有一个可见窗口,您可以遍历所有窗口并检查它们的 PID 以找到匹配项。您必须跳过不可见的窗口。或者更好的是,跳过非 Alt-Tab 窗口。这是它是如何完成的。

注意,我写这个只是为了好玩,我自己不会把它放在任何应用程序中。

BOOL IsAltTabWindow(HWND hwnd)
{
if (!IsWindowVisible(hwnd)) return FALSE;

HWND next = NULL;
HWND parent = GetAncestor(hwnd, GA_ROOTOWNER);
while (parent != next)
{
next = parent;
parent = GetLastActivePopup(parent);
if (IsWindowVisible(parent)) break;
}
if (next != hwnd) return FALSE;

TITLEBARINFO ti = { 0 };
ti.cbSize = sizeof(ti);
GetTitleBarInfo(hwnd, &ti);
if (ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) return FALSE;

if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return FALSE;

return TRUE;
}

BOOL CALLBACK enumProc(HWND hwnd, LPARAM lp)
{
DWORD search_pid = DWORD(lp);
if (!IsAltTabWindow(hwnd))
return 1;
DWORD pid = 0;
GetWindowThreadProcessId(hwnd, &pid);
if (pid != search_pid) return 1;
SetWindowText(hwnd, "un-advised code");
return 0;
}

int main()
{
DWORD search_pid = 0;
HWND hwnd = FindWindow(0, "Find me");
GetWindowThreadProcessId(hwnd, &search_pid);

EnumWindows(enumProc, LPARAM(search_pid));

return 0;
}


编辑,解释:

试试下面的代码。首先运行Window 的记事本,确保只有一个记事本实例。

如果你在 Windows 10 上运行下面的代码,它不会显示一个,而是 3 个与记事本具有相同 PID 的窗口。其中 2 个窗口是不可见的,它们由操作系统使用,我们不应该触摸它们。

所以我们至少要跳过不可见的窗口。还有许多其他系统窗口,我们也不希望与它们有任何关系。

IsAltTabWindow 是避免这些窗口的好方法。这确保我们只查看可以通过 Alt-Tab 键访问的窗口。

int main()
{
HWND hwnd = FindWindow("Notepad", 0);
if (!hwnd) return 0;
DWORD search_pid = 0;
GetWindowThreadProcessId(hwnd, &search_pid);

for (hwnd = GetWindow(GetDesktopWindow(), GW_CHILD);
hwnd; hwnd = GetWindow(hwnd, GW_HWNDNEXT))
{
char buf[300];
GetWindowText(hwnd, buf, 300);

DWORD pid = 0;
GetWindowThreadProcessId(hwnd, &pid);
if (pid == search_pid)
std::cout << pid << "\n";
}

return 0;
}

关于c++ - 查找窗口并更改其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com