Russian Qt Forum
Ноябрь 24, 2024, 06:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Задание коорлинат открываемых программ  (Прочитано 5641 раз)
MrGooD
Гость
« : Ноябрь 29, 2006, 19:30 »

Подскажите пожалуйста, я использую QProcess, лаунчу им .exe файл, как я могу ловить всплывающее окно, чтобы потом указать где ему появиться?(мне просто необходимо делать подгонку открывающихся программ под свой лаунчер)
Записан
Dendy
Гость
« Ответ #1 : Ноябрь 29, 2006, 20:18 »

Задача потенциально нерешаемая. Количество окон может бьІть как 0 (ноль) так и N (енн), которьІе программа сама вьІстроит как ей заблагорассудится. Есть платформозависимьІй Q_PID, можно попробовать с ним.
Записан
MrGooD
Гость
« Ответ #2 : Ноябрь 29, 2006, 21:40 »

А где можно посмотреть про этот Q_pid?
Записан
Dendy
Гость
« Ответ #3 : Ноябрь 30, 2006, 00:56 »

Винда: MSDN
Только не ищи прямое словосочетание.
Записан
Tonal
Гость
« Ответ #4 : Ноябрь 30, 2006, 08:02 »

Для винды можно указать дефолтные координаты окон процесса, (см CreateProcess +STARTUPINFO).
Кроме того, можно установить глобальный хук на создание окон и на сообщения.
Но кроме того, что это только для винды, возникают непонятки с процессами, которые сами контролируют свои размеры/положение.
Записан
MrGooD
Гость
« Ответ #5 : Декабрь 01, 2006, 20:33 »

Сделал, но программы появляются всё-равно где хотят
Делал так:

#include <Windows.h>


    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    memset(&si, 0, sizeof(STARTUPINFO));
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
   
    si.dwX=1000;
    si.dwXSize=100;
    si.dwY=0;
    si.dwYSize=200;
    si.dwFlags=STARTF_USEPOSITION;

    if( !CreateProcess( NULL,   // No module name (use command line).
        TEXT("notepad.exe"),                  // Command line.
        NULL,             // Process handle not inheritable.
        NULL,             // Thread handle not inheritable.
        FALSE,            // Set handle inheritance to FALSE.
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        NULL,             // Use parent's starting directory.
        &si,              // Pointer to STARTUPINFO structure.
        &pi )            // Pointer to PROCESS_INFORMATION structure.
    )
    {
        QMessageBox::information(this, "Îøèáêà","Íå óäà¸òñÿ çàïóñòèòü ïðîãðàììó!");
    }
Записан
Tonal
Гость
« Ответ #6 : Декабрь 01, 2006, 21:36 »

Забыл dwFlags заполнить.
Записан
MrGooD
Гость
« Ответ #7 : Декабрь 02, 2006, 01:13 »

Да нет, вроде заполнил

 si.dwFlags=STARTF_USEPOSITION;
Записан
Tonal
Гость
« Ответ #8 : Декабрь 02, 2006, 08:14 »

Немного утоптал твой код: ;-)
Код:
#include <iostream>
#include <windows.h>

using std::cout;
using std::endl;

int main() {
  STARTUPINFO si = {0};
  PROCESS_INFORMATION pi = {0};

  si.cb = sizeof(si);
  si.dwX = si.dwY = 0;
  si.dwXSize = si.dwYSize = 100;
  si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;

  if(!CreateProcess(
    0, TEXT("notepad.exe"),
    0, 0, false, 0, 0, 0,
    &si, &pi
  ))
    cout<<"Opanki"<<endl;
}

Если вызывать его несколько раз подряд, хорошо видно, что при открытии окно notepad-а дёргается.
Отсюда заключаем, что код сработал, но notepad сам контролирует своё положение и размеры - восстанавливает последние запомненные.
Записан
MrGooD
Гость
« Ответ #9 : Декабрь 02, 2006, 21:38 »

Сенки, за это, и за понимание. Кстати, если ланчить cmd, то всё открывается так как мы хотим Улыбающийся А можно тогда не указывать "начальую позицию", а допустим дать ей запуститься где она хочет, но потом уже передвинуть?
Записан
Tonal
Гость
« Ответ #10 : Декабрь 03, 2006, 00:37 »

Тоже вариант.
Ждёшь процесс на WaitForInputIdle, а после передвигаешь.
Но таки грабли остаются - не ясно, что получится с консольными процессами.
Ну и ешё нужно обрабатывать состояние (свёрнуто, распахнуто, обычное).
И не очень понятно как это будет соотноситься с самим приложением, если оно тоже меняет своё положение.
А если оно ещё и SDI...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.