我正在使用Windows MFC来创建一个小程序。 我想让程序的多个实例出现在级联位置。
目前程序始终显示为居中,即无法看到多个窗口。
是否有自动方式让Windows在级联位置创建多个实例?
要测试我使用多行的批处理脚本:
"start MyProgram.exe"
"start MyProgram.exe"
"start MyProgram.exe"
我使用的对话框来自CDialogEx(但我使用的是CDialog)
我希望这是对话框的标志/属性。
在更改.rc文件之前,必须具有此类属性
IDD_MAIN_DLG DIALOGEX 0, 0, 260, 185 STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION
我知道CascadeWindows()函数,但据我所知,它需要更多地了解已运行的实例
答案 0 :(得分:0)
以下代码如何作为起点?
#include <Psapi.h>
namespace {
size_t nWnds = 0;
HWND hWnds[10];
BOOL CALLBACK enumerate(HWND hWnd, LPARAM This)
{
HWND hWndThis = reinterpret_cast<HWND>(This);
TCHAR nameThis[MAX_PATH], nameOther[MAX_PATH];
VERIFY(GetWindowModuleFileName(hWndThis, nameThis, _countof(nameThis)));
TCHAR wndclass[32];
VERIFY(RealGetWindowClass(hWnd, wndclass, _countof(wndclass)));
if (_tcscmp(wndclass, _T("#32770")) == 0) {
DWORD pid;
GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess != NULL) {
if (GetModuleFileNameEx(hProcess, NULL, nameOther, _countof(nameOther))) {
if (_tcscmp(nameThis, nameOther) == 0) {
hWnds[nWnds++] = hWnd;
}
}
VERIFY(CloseHandle(hProcess));
hProcess = NULL;
}
}
return TRUE;
}
}
BOOL CMFCApplication1Dlg::OnInitDialog()
{
// ...
VERIFY(EnumWindows(enumerate, reinterpret_cast<LPARAM>(m_hWnd)));
if (nWnds > 1) {
VERIFY(CascadeWindows(NULL, MDITILE_ZORDER, NULL, nWnds, hWnds));
}
return TRUE;
}
它包含对OnInitDialog
的更改,以扫描您的可执行文件创建的所有顶级对话框,然后调用CascadeWindows
。当然,在枚举中,您还可以将找到的每个窗口移动到以CPoint(x, y)
开头的点,并在每个找到的窗口中按CSize(xoffset, yoffset)
更改。
要记住的一些事情:
CascadeWindows
看起来不是正确的解决方案,它会恢复所有最大化的窗口,并且不仅会触及您的流程创建的窗口(我更喜欢这样)。