因此,我正在构建一个程序,根据用户定义的进程是否正在运行来有条件地复制某些文件。现在,由于用户正在选择流程,我想过滤他们可以选择的流程,直到他们真正关心的流程。基本上我只想要可以alt-tabbed的进程/窗口。我已经找到了一些方法来获取正在运行的流程,但我还没有多少运气想出如何将它们过滤到我正在寻找的东西。现在,这是我用来获取流程名称和代码的代码。窗口名称,但我觉得这可能是更好的方法:
(仅供参考,我正在使用QT,以便QString和QStringLists来自哪里)
HWND hwnd_current = GetWindow(GetDesktopWindow(), GW_CHILD);
QStringList process_list;
do {
wchar_t str_window_name[MAX_PATH];
DWORD pid;
DWORD exStyles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_EXSTYLE);
DWORD styles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_STYLE);
if(!((exStyles & WS_EX_TOOLWINDOW) == 0 && (styles & WS_CHILD) == 0)){
continue;
}
if(!GetWindowText(hwnd_current, str_window_name, MAX_PATH)){
continue;
}
GetWindowThreadProcessId(hwnd_current, &pid);
if(pid == GetCurrentProcessId()){
continue;
}
wchar_t fileName[MAX_PATH];
LPWSTR file_name;
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if(hProcess){
DWORD dwSize = MAX_PATH;
QueryFullProcessImageName(hProcess, 0, fileName, &dwSize);
file_name = PathFindFileName(fileName);
}
CloseHandle(hProcess);
QString boxString = QString("[");
#ifdef UNICODE
QString q_file_name = QString::fromStdWString(file_name);
QString q_str_window_name = QString::fromStdWString(str_window_name);
#else
QString q_file_name = QString::fromStdString(file_name);
QString q_str_window_name = QString::fromStdString(str_window_name);
#endif
boxString.append(q_file_name);
boxString.append("] ");
boxString.append(q_str_window_name);
if(!q_file_name.isEmpty() && !q_str_window_name.isEmpty() && !pNameList.contains(boxString) && !process_list.contains(q_file_name)){
if(!q_str_window_name.endsWith("MSCTFIME UI") && !q_str_window_name.endsWith("Default IME")){
process_list.append(q_file_name);
pNameList.append(boxString);
}
}
} while (hwnd_current = GetNextWindow(hwnd_current, GW_HWNDNEXT));
任何建议都将非常感谢!谢谢!
答案 0 :(得分:1)
这与taskbar filters windows非常相似。
您似乎非常接近,但您应检查窗口是否可见,WS_EX_APPWINDOW
允许工具窗口为treated as a normal window。