2015-02-18 2 views
0

программно Я открываю панель управления Windows с помощью 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().

Проблема в том, что я не мог найти способ получить этот дескриптор в случае панели управления. Я не могу перечислять на основе заголовка окна или класса окна, потому что я не знаю ни того, ни другого.

Кто-то уже сделал это с Windows 7?

+0

Возможный дубликат [Как получить hWnd окна, открытого ShellExecuteEx .. hProcess?] (Http://stackoverflow.com/questions/3269390/how-to-get-hwnd-of-window-opened-by- shellexecuteex-hprocess) – David

+0

Я так не думаю: я также пытался использовать CreateProcess() вместо ShellEexecute(), чтобы я мог использовать PID для перечисления, но это не помогает. Я подозреваю, что причиной этого является rundll32.exe (строка командной строки: rundll32.exe shell32.dll, Control_RunDLL), но окно панели управления, вероятно, не связано с процессом rundll32.exe, а с explorer.exe (?). Но перечисление всех окон explorer.exe также не поможет, потому что я не знаю, какое имя или класс окна панели управления в любом случае. – Andariel

ответ

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; 
} 

Тогда главный вопрос локализации заголовка окна: если вам нужно иметь Thos код работает на панели управления, вы хотите thisClass-> getWndName(), чтобы вернуть строку, которая зависит от вашей страны или региона.

0

Если предложенный дубликат не работает, это возможно с помощью функции FindWindow.

Обратите внимание, что панель управления может иметь пару имен, в зависимости от ее вида, поэтому вам нужно будет проверить различные параметры.

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

Обратите внимание, что этот метод может завершиться неудачей, если у вас есть, скажем, папка с именем «Панель управления».

+0

Здравствуйте, это тоже не работает. FindWindow(), как известно, ненадежный, когда вы используете поле заголовка окна, я даже не мог найти дескриптор окна Notepad! Использование класса Window работает лучше, но в случае панели управления я не мог идентифицировать этот класс. – Andariel

+0

Действительно? Вы просто искали Notepad, или вы искали «Untitled - Notepad» (Предполагая, что это новое окно «Блокнот»)? У меня никогда не было проблем с этим, пока окно существовало и было уникальным. – David

+0

Я использую «Без названия - Блокнот» без успеха. В любом случае вы не можете использовать этот метод для панели управления. – Andariel

Смежные вопросы