Здравствуйте!
В общем имею следующую проблему: есть приложение, главное окно скрыто, по комбинации клавиш выводится окошко и ему задается фокус, при потере фокуса (клик за пределами окна) оно скрывается, при другой комбинации все также, но перед выводом окошка выполняется программа имитирующая комбинацию клавиш 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
Буду рад любым предложениям, сейчас просто в недоумении от поведения программы.