NeiroNext
@NeiroNext

Как установить фокус окну при определенных условиях?

Здравствуйте!
В общем имею следующую проблему: есть приложение, главное окно скрыто, по комбинации клавиш выводится окошко и ему задается фокус, при потере фокуса (клик за пределами окна) оно скрывается, при другой комбинации все также, но перед выводом окошка выполняется программа имитирующая комбинацию клавиш Ctrl+C, в этом случае окно также появляется но не имеет фокус и поэтому и не может его потерять при клике за пределами окна, что является неудобством т.к. скрываться оно должно именно при клике за его пределами.
Несколько примечаний:
1. окно не получает фокус только после выполнения утилиты имитации Ctrl+C (после запуска пустой утилиты все норм);
2. если сделать паузу в отображении окошка после запуска утилиты фокуса также не будет;
3. если отображать главное окно и выполнять комбинации клавиш на нем то фокус всегда есть;
4. если во время паузы отображения окна (уже после выполнения утилиты имитации Ctr+C) отобразить окно с помощью другой комбинации клавиш то фокус в этом окне будет, но после завершения паузы окно вызванное первой комбинацией клавиш все-равно будет без фокуса
Ниже привожу фрагменты сходного кода тестового приложения:
Вот код утилитки которая имитирует комбинацию клавиш Ctrl+C, задержка для предотвращения конфликта с комбинацией которой вызывается запуск этой утилиты в программе, делал на основе примера с оф. сайта Майкрософта:
...
    Sleep(500);
    // Simulate a key press
    keybd_event(  VK_CONTROL,
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | 0,
                  0 );
    keybd_event(  (BYTE)'C',
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | 0,
                  0 );

    // Simulate a key release
    keybd_event( (BYTE)'C',
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                  0);
    keybd_event(  VK_CONTROL,
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                  0);
...


Вот пример главного окна программы, которое скрыто:
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    w = new MyWidget;
    p = new QProcess;

    hot1 = new QxtGlobalShortcut(QKeySequence("Shift+Meta+A"));
    hot2 = new QxtGlobalShortcut(QKeySequence("Shift+Meta+Z"));

  //connect(p,    SIGNAL(finished(int)), SLOT(normalShow()));
    connect(hot1, SIGNAL(activated()),   SLOT(normalShow()));
    connect(hot2, SIGNAL(activated()),   SLOT(afterShow()));
}

Widget::~Widget() { }


void Widget::normalShow() {
    w->show();
}


void Widget::afterShow() {
    p->start("win_xsel/debug/win_xsel.exe");
    QTimer::singleShot(1000*10, this, SLOT(normalShow()));
}

hot1 и hot2 используются для обычного отображения и отображения после вызова процесса (утилитки), метод отображения как видно один и тот же, задержку сделал что-бы было видно что хоть имитация комбинации Ctrl+C явно мешает получить окну фокус, но при этом при отображении окна второй комбинацией в этом промежутке окно всегда имеет фокус, а по истечении задержки последнее его все-равно не имеет.
Мучался с проблемой целый день + сегодня, так и не понял в чем прикол что окно имеет фокус если его вызвать одной комбинацией даже после имитации Crtl+C и не имеет если второй, хотя функция отображения одна и та же.
Вот измененная функция отображения:
void MyWidget::show() {
    QWidget::show();
    SetForegroundWindow(winId());
    //SetFocus(winId());
}

Вот если кто хочет проверить исходники примера (нужна libQxt): text.zip
Буду рад любым предложениям, сейчас просто в недоумении от поведения программы.
  • Вопрос задан
  • 1704 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы