Russian Qt Forum

Qt => Общие вопросы => Тема начата: Firefox от Марта 21, 2012, 12:22



Название: QCombobox и FindWindow
Отправлено: Firefox от Марта 21, 2012, 12:22
Здравствуйте. хочу спросить такой вопрос может кто подскажет. пользуюсь FindWindow и BringWindowToTop для смены окон из управляющей программы. но в этих окнах есть QCombobox и после работы с ним оператором перестают срабатывать FinedWindow и BringWindowToTop. на QCombobox стоит флаг NoFocus. что сделать надо в такой ситуации с сомбобоксом?


Название: Re: QCombobox и FinedWindow
Отправлено: Пантер от Марта 21, 2012, 12:28
Это WinApi чтоли?


Название: Re: QCombobox и FinedWindow
Отправлено: Bepec от Марта 21, 2012, 12:51
Угу. Это winApi...


Название: Re: QCombobox и FinedWindow
Отправлено: Firefox от Марта 21, 2012, 18:17
да это winApi. у меня qt 4.3.3 и как выводить окно другой программы на передний план функциями qt я не знаю.


Название: Re: QCombobox и FinedWindow
Отправлено: Bepec от Марта 21, 2012, 20:12
ээ... Т.е. ты не своё приложение выводишь?


Название: Re: QCombobox и FinedWindow
Отправлено: Alex Custov от Марта 21, 2012, 20:20
Очевидно, что информации тут дано мало. Покажи минимальный код, и объясни что значит не срабатывает.


Название: Re: QCombobox и FinedWindow
Отправлено: Firefox от Марта 21, 2012, 20:46
запущена моя программа и 10 других экзешников, в которых есть комбобоксы. по нажатию на кнопкув моей программе должно определенное приложение выходить на передний план. вот я и ищу идентификатор окна функцией FindWindow и вывожу на передний план функцией BringWindowToTop(идентификатор окна) и setForegroundWindow(идентификатор окна). но если в приложении которое я хочу вывести на передний план кто-то поработал до этого с комбобоксом, эти функции не срабатывают.


Название: Re: QCombobox и FinedWindow
Отправлено: Firefox от Марта 21, 2012, 20:56
да моя программа работает в фоне и координирует работу других и все. а кнопки на клавиатуре!


Название: Re: QCombobox и FinedWindow
Отправлено: Igors от Марта 21, 2012, 21:30
Цитировать
- на Крупской выходите?
- та не на Крупской а на Крупского! Там еще и памятник ему стоит!

Исправьте то несчастное FinedWindow на FindWindow (find = искать)
И сообщите народу как ищете хендл окна


Название: Re: QCombobox и FinedWindow
Отправлено: Firefox от Марта 22, 2012, 09:13
Код:
 LPCWSTR Current_po;
Current_po=L"reg_rec1";
Id_REK1=::FindWindow(NULL,Current_po);
if(Id_REK1!=false)
        {
BringWindowToTop(Id_REK1);
SetForegroundWindow(Id_REK1);
}


Название: Re: QCombobox и FinedWindow
Отправлено: Firefox от Марта 22, 2012, 09:18
и ещё бы хотелось спросить. у меня в программе не отлавливается события нажатия клавиатуры, так как моя программа в данный момент не активна. а активна та что на переднем плате. пока что организована передача данных между программами, но это не удобно. как мне самостоятельно отлавливать события нажатия если моя программа в фоне?


Название: Re: QCombobox и FinedWindow
Отправлено: Bepec от Марта 22, 2012, 09:19
Если НЕплатформонезависимо - ставить хук глобальный(кейлоггер банальный получится).
А по делу - пересмотреть архитектуру. Зачем тебе нажатия в другом окне в своём приложении?


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 22, 2012, 10:22
мне оно и не надо. вот по этому и спрашиваю, как ловить нажатие клавиатуры в своей программе которая в фоне. я ещё не сильно разбираюсь в qt, не могли бы вы пояснить, что значит глобальный хук на примере. я делаю это так
Код:
void KOS1::keyPressEvent(QKeyEvent * ev)
{

switch (ev->key())
{
case Qt::Key_F10:
close();
break;
case Qt::Key_F5://пока что для открытия прибора

if(Dev!=false && Zakaz=="KOS")
{
BringWindowToTop(Dev);
SetForegroundWindow(Dev);
}
}
}


Название: Re: QCombobox и FindWindow
Отправлено: Bepec от Марта 22, 2012, 10:32
Так. Останавливаемся. Успокаиваюсь(я).

1. У вас эта программа является менеждером?
2. Эта программа вызывает свои окна-виджеты в разных условиях?
3. Или эта программа запускает отдельные независимые Qt программы в разных условиях?
4. Почему тогда эта программа не может являться родителем независимых Qt программ? (аля контейнер программ)


Находясь в фоне, программа не получит нажатий клавиш. Ибо они ей не нужны(она ж в фоне).
Если активно другое Qt окно, оно получит эти нажатия клавиш. И может их передать программе-менеджеру(но ЗАЧЕМ???) 

Если активно не Qt окно, оно никуда их не передаст ;)

PS на словах опишите чего хотите, блин(я вот хочу блин ;) ). Управляющая чем?? Как хочется, чтобы она вызывала функционал??


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 22, 2012, 10:38
Запускает она отдельные qt приложения(название.exe). делаю это функцией ShellExecute(). поработав в одной программе(окно программы занимает весь экран и не имеет кнопок управления- свернуть, закрыть.. то есть является виджетом как бы) оператор хочет переключиться на другую программу и поработать в ней. для чего нажимает например F1. и другая программа работающая в фоне выходит на передний план.таких программ 10 штук и + моя. которая и делает эти переходы. делать это в запущенных программа нельзя. вот для этого я и делаю небольшую программку координирующую работу запущенных приложений.


Название: Re: QCombobox и FinedWindow
Отправлено: Alex Custov от Марта 22, 2012, 11:55
Код:
Id_REK1=::FindWindow(NULL,Current_po);
if(Id_REK1!=false)

FindWindow возвращает хендл окна или NULL, почему ты сравниваешь с false?


Название: Re: QCombobox и FindWindow
Отправлено: Alex Custov от Марта 22, 2012, 11:59
мне оно и не надо. вот по этому и спрашиваю, как ловить нажатие клавиатуры в своей программе которая в фоне

программа не имеющая клавиатурного фокуса не будет получать клавиатурные события. Делайте глобальные сочетания клавиш, например, через QxtGlobalShortcut. К тому же нужно понимать, что в винде чтобы переместить окно на foreground должны выполняться несколько условий, описанных в MSDN, и это сделать получиться не всегда.


Название: Re: QCombobox и FindWindow
Отправлено: Bepec от Марта 22, 2012, 12:02
Помоему такая архитектура бред - "несколько окон без элементов управления, управляемых отдельным невидимым менегером по сочетаниям быстрых клавиш"...

Как то даже боюсь спросить - а если пользователь захочет закрыть одно окно, оставив второе, ваша программа такое просчитывает? (alt+f4 рулят)


Название: Re: QCombobox и FinedWindow
Отправлено: V1KT0P от Марта 22, 2012, 12:06
да это winApi. у меня qt 4.3.3 и как выводить окно другой программы на передний план функциями qt я не знаю.
Все программы написаны c использованием Qt4?


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 23, 2012, 07:30
да все программы написаны с использованием библиотеки qt 4.3.3. а что касается структуры работы с окнами, то это специфическое ПО поэтому выполняться операторами будут только определенные действия. Alt+F4 не входит в этот набор. вставлять в каждый модуль элементы управления по переключению между модулями есть плохо. модули должны быть независимые и ни с чем не связанные. они только выполняют свои расчетные задачи. и могут запускаться в разных "заказах" по разному и управление будет разное. поэтому управление их не должно касаться.


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 23, 2012, 07:47
по поводу сравнения NULL конечно корректнее, но вданном варианте не вижу большой ошибки. и программа воспринимает все правильно.


Название: Re: QCombobox и FindWindow
Отправлено: Bepec от Марта 23, 2012, 08:00
Конечно это не моё дело, а то, что alt+F4 перехватывается Виндой и требует закрытия окна, это ничего ? :P Советую предусмотреть "я захотел поиграть в пасьянс и решил закрыть окна alt+F4".

В принципе теперь понятно - вы пишете оболочку для работы с чем-то. Тогда тем более надо такие случаи предусмотреть.

Советую использовать SetForegroundWindow(hwnd); для переключения окна. У меня с ним ещё никаких проблем не было.


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 23, 2012, 09:31
я использую SetForegroundWindow(), в примере кода на 1 странице он присутствует. но все равно после работы в QCombobox
 не отрабатывает FindWindow(), такое ощущение что оно возвращает не указатель на окно приложения, а указатель на QCombobox с которым осуществлялась работа. из за чего, конечно, я не могу далее сделать SetForegroundWindow() правильно.


Название: Re: QCombobox и FindWindow
Отправлено: Igors от Марта 23, 2012, 11:49
я использую SetForegroundWindow(), в примере кода на 1 странице он присутствует. но все равно после работы в QCombobox
 не отрабатывает FindWindow(), такое ощущение что оно возвращает не указатель на окно приложения, а указатель на QCombobox с которым осуществлялась работа. из за чего, конечно, я не могу далее сделать SetForegroundWindow() правильно.
Значит задействуйте еще и первый параметр lpClassName. Когда все работает (комбик не трогают) распечатайте имя класса для каждого найденного хендла (если не ошибаюсь GetClassName) а затем вставьте найденные имена классов в Ваш текст


Название: Re: QCombobox и FindWindow
Отправлено: V1KT0P от Марта 23, 2012, 12:19
да все программы написаны с использованием библиотеки qt 4.3.3. а что касается структуры работы с окнами, то это специфическое ПО поэтому выполняться операторами будут только определенные действия. Alt+F4 не входит в этот набор. вставлять в каждый модуль элементы управления по переключению между модулями есть плохо.
Если это ваши программы, то не проще ли каждую программу превратить в плагин, а затем подключать к менеджеру?
Получится очень удобно: грузишь плагин, через интерфейс получаешь указатель на виджет. А затем по нажатию кнопки убираешь виджет и показываешь другой.


Название: Re: QCombobox и FindWindow
Отправлено: Alex Custov от Марта 23, 2012, 12:40
не отрабатывает FindWindow(), такое ощущение что оно возвращает не указатель на окно приложения, а указатель на QCombobox с которым осуществлялась работа. из за чего, конечно, я не могу далее сделать SetForegroundWindow() правильно.

FindWindow ищет top-level окна, она должен работать правильно. Где именно вызывается этот код? Случайно не обработчике keyPressEvent? Ты дебажила код, хотя бы с помощью qDebug?


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 23, 2012, 15:46
код вызывается в данный момент по событию. событие отрабатывает. работаю в VS 2003 с интегрированным qt поэтому debag там есть.есть такая функция перед BringWindowToTop, -  Application->Restore();, но применить её к QApplication я не смогла.


Название: Re: QCombobox и FindWindow
Отправлено: Firefox от Марта 23, 2012, 15:48
Ещё может кто объяснит как правильно поставить класс QxtGlobalShortcut. я его скачала но не получается. а в гугле очень скудные инструкции только нашла.