Как вернуть фокус предыдущему окну

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Как вернуть фокус предыдущему окну

Сообщение vvs_adm » 03.02.2005 (Чт) 4:23

Вопрос следующий :
имеем в панели быстрого запуска ярлык на VB-exe. На столе какое либо окно ( ну например IE ) в данный момент активно. Но как только происходит клик по ярлыку, окно теряет фокус ( ну заодно и наша форма запускается с visible=false ) Как теперь вернуть фокус окну? Че та никак :( Сколько путей перепробовал, но фокус в лучшем случае возвращается на панель Пуск...

Вообще задача, как мне казалось, примитивная. Нужно по щелчку на панели сделать PrintScreen и загнать рисунок в файл... Это получилось в пять сек... Но вот Alt+PrintScreen никак, потому что фокус теряется пока навечно. Помогите пож. его найти .

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 12:10

Я так и знал, что это слишком легко :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.02.2005 (Чт) 13:19

Посмотри такую вещь как RegisterHotkey.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 13:56

GSerg писал(а):Посмотри такую вещь как RegisterHotkey.


Не, это совсем даже близко не то... Так и Альт+ПринтСкрин нажать в принципе можно... Плюс прога постоянно висит в процессах. Нужно именно : клик мышью на панели быстрого запуска -> запуск проги ВБ -> скрин АКТИВНОГО ДО КЛИКА окна в буфер -> дальше я сам -> и нафиг из программы ...
Последний раз редактировалось vvs_adm 03.02.2005 (Чт) 16:41, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.02.2005 (Чт) 14:00

Зачем это?
В чём конечный результат?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 14:23

Конечный результат в максимально быстром способе (т.е. с помощью мыши) для непосвященных пользователей сделать скрин окна, который автоматом улетит с нужным именем (ну типа время-заголовок окна) в нужную директорию. Сделать полный скрин экрана не представляет для меня проблем, но так как желателен скрин именно активного окна (остальное просто лишняя картинка), то хотелось бы вернуть фокус активному окну. Я же блин тока панели пуск могу фокус вернуть :( а нафига оно мне надо :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.02.2005 (Чт) 15:05

Ну и почему не зарегистрировать сочетание клавиш, которое будет принтскринить текущее окно вообще без потери фокуса?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 16:40

Потому что уже есть такое сочетание клавиш в винде Alt+PrintScreen. Оно конечно фокус не ворует и именно его то я и генерирую в программе, но фокус то пропадает в момент клика на панель быстрого запуска. Вот в чем дело. Моя программа запускается, а фокуса у активного перед этим окна уже тютю и я не могу никак найти ни в поисковиках ни у знакомых, как же мне вернуть уворованный при клике на панель фокус

P.S. : то ли я сильно торможу, то ли невнятно объясняю :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.02.2005 (Чт) 16:45

Ну нафига?

Зарегистрируй (RegisterHotkey!) какое-нибудь ctrl+alt+shift+s, потом отлавливай в своей фоновой форме приход сообщения о нажатии (WM_HOTKEY), и как придёт, снимай скрин (для простоты - bitblt с getwindowdc на твой picturebox, а потом savepicture) с текущего активного окна!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 16:55

Ну разве же не нужно будет при этом нажимать "какое-нибудь ctrl+alt+shift+s", что бы "отлавливай в своей фоновой форме приход сообщения о нажатии". Да пока они нажмут "какое-нибудь ctrl+alt+shift+s" уже принтскринить будет нечего. Принтскринить нужно баги тестерам. И нужно максимально быстрая реакция (клик мышкой на панель), что бы заскринить баг. Но я могу заскринить тока PrintScreen а хота Alt+PrintScreen для абсолютного кайфа. Неужели нельзя возвращать фокусы окнам ну что-то типа в обратном порядке... Не учитывая отцов-родителей и других родственников? Не могет такого быть :(

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 17:40

Что-то я непойму... Это настолько сложно, что никто не может ответить или настолько просто, что никто не хочет даже отвечать :(

step
Бывалый
Бывалый
 
Сообщения: 217
Зарегистрирован: 03.08.2004 (Вт) 16:19

Сообщение step » 03.02.2005 (Чт) 17:54

Лови Имя окна, и ставь окно поверх всех!

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 18:06

Но программе неизвестно имя окна... Имя может быть любое, как же я его поймаю... Если бы баги отлавливались в окне с постоянным именем, конечно можно было бы по имени его наверх вытащить, но во первых имя, как я уже говорил, неизвестно, а во вторых какая-то неуниверсальная программа получается. Нужно именно ВЕРНУТЬ ФОКУС ПРЕДЫДУЩЕМУ АКТИВНОМУ ОКНУ. Пробовал по очереди посылать активным окнам киллфокус даже с горя, так как киллфокус по описанию снимает фокус с окна и возвращает его предыдущему... Но видать кривое описание и все фокусы у них крутятся в z-последовательности, в которую нужное окно уже не входит, так как рождается та последовательность от панельки пуск. Была бы функция - перейти в предыдущую z-последовательность :)

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.02.2005 (Чт) 18:17

Может
Код: Выделить всё
Declare Function AllowSetForegroundWindow Lib "user32.dll" (ByVal dwProcessId As Long) As Long

чем то поможет :?:
الفيجوال بيسك الرابح

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 03.02.2005 (Чт) 18:38

По поводу "AllowSetForegroundWindow" : выдержка из описания ...... Чтобы любой процесс мог выводить окно «поверх» остальных окон, открытых Вашим потоком, передайте... и т.д. В том то и дело, что предыдущее активное окно никакого родственного отношения к моему процессу не имеет...[/b]

Имел бы я хэндл пред активного окна, я б нашел, как ему фокус вернуть... Вот как найти хэндл окна, бывшего активным "2 окна назад" (кошмарно коряво звучит :) ) Или к примеру "три окна назад" ?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.02.2005 (Пт) 4:15

vvs_adm писал(а):Что-то я непойму... Это настолько сложно, что никто не может ответить или настолько просто, что никто не хочет даже отвечать :(

Я тебе ответил, как сделал бы я. Ты же упорно хочешь кликать по столу.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 04.02.2005 (Пт) 8:24

GSerg писал(а):Я тебе ответил, как сделал бы я. Ты же упорно хочешь кликать по столу.
Ну так мне нужно изменить "нажатие двух клавиш" на "клик мышкой" , а ты предлагаешь изменить "нажатие двух клавиш" на "нажатие минимум трех" . И зачем мне такое счастье? На три клавиши нажать разве быстрее, чем на две? А мне нужна максимально быстрая реакция на ошибку приложения, которая вот вот исчезнет и в этот момент у пользователя в руках мышь, которой ему кликнуть быстрее всего.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.02.2005 (Пт) 9:33

Как хочешь.

0. Можно зарегистрировать и две клавиши.
1. Пиши native dll, помещай в неё установку и обработку WH_CBT. Тогда будешь получать сообщения об активации и деактивации всех окон в системе.
2. Юзай функцию GetWindow для анализа ZOrder окон. Ибо известно, что окно NOTOPMOST, бывшее активным, помещается непосредственно за текущим активным окном при первой потере фокуса. Если фокус уходит на десктоп, то окно остаётся наверху ZOrder. Ищи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 160

    TopList