燮
我想要做的是找到一个窗口,虽然它是进程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")
我想要的一个例子会帮助我很多=) 谢谢你的耐心等待。
答案 0 :(得分:2)
不,这不可能。多个窗口可以具有相同的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;
}
答案 1 :(得分:0)
您可能会看一下15年前在www.codeguru.com上发布的这个旧的基于MFC的应用程序(时光飞逝......)。
基于鼠标点击屏幕获取HWND的机制可能会让您感兴趣。
http://www.codeguru.com/cpp/misc/samples/article.php/c1465/Password-Retrieval-Application.htm
Ž。