查找 Window 并更改其名称
Find Window and change it's name
补
我想做的是找到一个 window 虽然它是进程 ID,获取它的名称 window 并将其更改为我想要的东西。
我发现了一些关于它的东西:(代码 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,获得该进程的 window 名称,这样代码就可以将 Hwnd 识别为我的 window 名称并将其更改为我想要的名称。
像这样:
Process = "anyprocess.exe"
Get Process ID <
Process ID = 1234567
Get window name from the ProcessID we have <
Window name = "ILoveYou"
Change "ILoveYou" to "IHaveYou"
如果我有多个 window 同名,有一种方法可以检查打开的第一个,这样我就不会更改另一个 windows ?
在我看来,从进程 ID 中获取 WindowName 似乎更安全,问题是我不想对代码说我知道 window 名称,我希望它找到它并且改变它就像连姆·尼森对那些坏人所做的那样。
而且我还想知道更多关于使用那些“(0,....”或“(NULL,....”的信息,"FindWindowA" 命令只是一个例子,我明白了这总是不知道如何正确使用它:
FindWindowA(0, "WindowName")
我想要的一个例子会对我有很大帮助 =)
感谢您的耐心等待。
您可能会看看 www.codeguru.com 15 年前发布的基于 MFC 的旧应用程序(时间过得真快...)。
您可能会对基于在屏幕上单击鼠标获取 HWND 的机制感兴趣。
http://www.codeguru.com/cpp/misc/samples/article.php/c1465/Password-Retrieval-Application.htm
Z.
不,这是不可能的。多个 window 可以具有相同的 PID。
但是,假设目标应用程序是单线程的,只有一个可见的 window,您可以遍历所有 windows 并检查它们的 PID 以找到匹配项。你必须跳过不可见的windows。或者更好的是,跳过非 Alt-Tab windows。这是它是如何完成的。
注意,我写这个只是为了好玩,我自己不会把它放在任何应用程序中。
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 个 windows 与记事本具有相同的 PID。其中 2 个 windows 是不可见的,它们被操作系统使用,我们不应该接触它们。
所以我们至少要跳过隐形 windows。还有许多其他系统 windows,我们也不希望与它们有任何关系。
IsAltTabWindow
是避免那些 windows 的好方法。这确保我们只查看可以通过 Alt-Tab 键访问的 windows。
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;
}
补
我想做的是找到一个 window 虽然它是进程 ID,获取它的名称 window 并将其更改为我想要的东西。
我发现了一些关于它的东西:(代码 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,获得该进程的 window 名称,这样代码就可以将 Hwnd 识别为我的 window 名称并将其更改为我想要的名称。 像这样:
Process = "anyprocess.exe"
Get Process ID <
Process ID = 1234567
Get window name from the ProcessID we have <
Window name = "ILoveYou"
Change "ILoveYou" to "IHaveYou"
如果我有多个 window 同名,有一种方法可以检查打开的第一个,这样我就不会更改另一个 windows ?
在我看来,从进程 ID 中获取 WindowName 似乎更安全,问题是我不想对代码说我知道 window 名称,我希望它找到它并且改变它就像连姆·尼森对那些坏人所做的那样。
而且我还想知道更多关于使用那些“(0,....”或“(NULL,....”的信息,"FindWindowA" 命令只是一个例子,我明白了这总是不知道如何正确使用它:
FindWindowA(0, "WindowName")
我想要的一个例子会对我有很大帮助 =) 感谢您的耐心等待。
您可能会看看 www.codeguru.com 15 年前发布的基于 MFC 的旧应用程序(时间过得真快...)。
您可能会对基于在屏幕上单击鼠标获取 HWND 的机制感兴趣。
http://www.codeguru.com/cpp/misc/samples/article.php/c1465/Password-Retrieval-Application.htm
Z.
不,这是不可能的。多个 window 可以具有相同的 PID。
但是,假设目标应用程序是单线程的,只有一个可见的 window,您可以遍历所有 windows 并检查它们的 PID 以找到匹配项。你必须跳过不可见的windows。或者更好的是,跳过非 Alt-Tab windows。这是它是如何完成的。
注意,我写这个只是为了好玩,我自己不会把它放在任何应用程序中。
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 个 windows 与记事本具有相同的 PID。其中 2 个 windows 是不可见的,它们被操作系统使用,我们不应该接触它们。
所以我们至少要跳过隐形 windows。还有许多其他系统 windows,我们也不希望与它们有任何关系。
IsAltTabWindow
是避免那些 windows 的好方法。这确保我们只查看可以通过 Alt-Tab 键访问的 windows。
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;
}