以编程方式更改Windows控制面板的大小和/或位置

时间:2015-02-18 07:52:03

标签: c++ windows windows-7

我正在使用ShellExecute()以编程方式打开Windows控制面板:

TCHAR strParameter[MAX_PATH];
wsprintf(strParameter, _T("shell32.dll, Control_RunDLL \"%ws\""), strApp);
HINSTANCE result = ShellExecute(NULL, _T("open"), _T("rundll32.exe"), strParameter, NULL, SW_SHOWNORMAL) ;

现在,我想通过更改其大小或位置来操作“控制面板”窗口。

我知道,一旦获得窗口句柄,您可以使用SetWindowPos()

问题是在控制面板的情况下我找不到任何方法来获取该句柄。我无法根据Window Title或Window Class进行枚举,因为我不知道其中任何一个。

有人已经使用Windows 7完成了这项工作吗?

2 个答案:

答案 0 :(得分:0)

如果建议的副本不起作用,则可以使用FindWindow功能。

请注意,控制面板可能有几个名称,具体取决于其视图,因此您必须检查不同的选项。

HWND cp = FindWindow(0, "Control Panel");
if(!cp){
    cp = FindWindow(0, "All Control Panel Items");
}
if(!cp){
    // Control Panel not open
}

请注意,如果您打开名为“控制面板”的文件夹,则此方法可能会失败。

答案 1 :(得分:0)

最后使用所有窗口的枚举找到了正确的方法:

BOOL CALLBACK FindWindowsByTitle(HWND hwnd,LPARAM lParam)
{
    LaunchApplication * thisClass = reinterpret_cast<LaunchApplication *>(lParam);
    TCHAR windowName[MAX_PATH] = {0};
    int windowNameLength = 0;
    LRESULT result = SendMessage(hwnd, WM_GETTEXT, MAX_PATH, LPARAM(windowName));
    windowNameLength = _tcslen(windowName);
    if(windowNameLength)
    {
            if (StrStrI(windowName, (TCHAR *)thisClass->getWndName()))
            {
                // found window name containing BT value
                return FALSE;
            }
    }

    return TRUE;
}

然后主要问题是Windows标题的本地化:如果你需要让代码适用于控制面板,你希望thisClass-&gt; getWndName()返回一个取决于你的国家或地区的字符串。