Как сделать так, чтобы моя программа потеряла фокус

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

Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 15.02.2009 (Вс) 14:43

Вот, собственно - это и есть вопрос: Как сделать так, чтобы моя программа потеряла фокус. Подразумевается, что фокус должен вернуться в ту программу, которая была активна до меня.
Артур
 
   

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение dr.MIG » 15.02.2009 (Вс) 15:07

Если в программе одно окно, то самое первое, что приходит в голову это SendKeys "%{TAB}", True
Salus populi suprema lex

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение oskolok_vatbI » 15.02.2009 (Вс) 15:09

Может как-то через SetForegroundWindow и GetForegroundWindow и таймер ? Ну это так, домыслы, знающие поправят.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 15.02.2009 (Вс) 19:52

Да, SetForegroundWindow помогла :)

С ней есть проблема, если фокус не у моей программы - тогда то окно, которое я попытаюсь активировать, просто помигает из панели задач. А когда фокус у меня, отдать его оказалось - ни каких проблем.

Если изначально фокус не у меня, то я решил проблему с помощью подложного окна. Оно у меня маленькое, невидимое и живёт за пределами экрана. Когда надо что-нибудь активировать, я "показываю" своё подложное окно. Хоть оно и за кулисами, но исправно берёт на себя фокус. А после этого уже отдаю фокус кому хочу, а подложное окно снова прячу :)
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение tyomitch » 15.02.2009 (Вс) 19:56

arthur2 писал(а):Если изначально фокус не у меня, то я решил проблему с помощью подложного окна. Оно у меня маленькое, невидимое и живёт за пределами экрана. Когда надо что-нибудь активировать, я "показываю" своё подложное окно. Хоть оно и за кулисами, но исправно берёт на себя фокус. А после этого уже отдаю фокус кому хочу, а подложное окно снова прячу :)

А анимация сквозь твоё подложное окно видна?
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 15.02.2009 (Вс) 20:45

Не понял вопроса :oops:

Оно у меня за пределами экрана : move -with,-height
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение tyomitch » 15.02.2009 (Вс) 20:56

Ага. Тогда не понял твой трюк.
Каким образом подложное окно принимает фокус?
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 15.02.2009 (Вс) 22:22

Ага. Тогда не понял твой трюк.
Каким образом подложное окно принимает фокус?


В общем, фокус не удался :) То есть, я неправильно интерпретировал то, что у меня вышло, и всё работает без всяких подложных окон.

Проблема была, когда я кликал на значке в трее и появлялось моё окно, а фокус оказывался непонятно где. Тогда я и придумал подложное окно, прилепил SetForegroundWindow и всё заработало... но подложное окно действительно оказалось не при чём :oops:

Изначально я просто думал, что когда кликаешь по значку трея, фокус не у меня... а он-то оказывается, всё же у меня! Так что это я перемудрил :)
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение tyomitch » 15.02.2009 (Вс) 23:09

Ага.
А мне примерещился вон какой трюк для воровства фокуса: сделать окно без рамки, поверх всех, на весь экран, и отрисовать на нём полный скриншот.
По первому клику, фокус у нас :mrgreen:
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 15.02.2009 (Вс) 23:29

Забавно :lol:

А есть способ действительно выдать кому-нибудь фокус, если он не у тебя?

У меня по мотивом моего неудавшегося фокуса появилась такая мысль: создать вспомогательную программу и передавать ей хендл нужного окна в качестве параметра. Затем запускать её обычным Shell по описанной схеме (за кулисами экрана), а она уже передаст фокус нужному окну и выгрузится :roll:
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 16.02.2009 (Пн) 0:02

Я так полагаю, что это ограничено специально - чтобы у юзера не всплывали перед глазами всякие разные непонятные окна :) Shell тоже не запускает программу с фокусом, если запускать его из программы без фокуса.

В общем, Аблом :?
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение tyomitch » 16.02.2009 (Пн) 0:03

arthur2 писал(а):А есть способ действительно выдать кому-нибудь фокус, если он не у тебя?

Легального нет.
Раньше были хаки через AttachThreadInput, но в Висте, если не раньше, их вырубили.
И слава богу.

arthur2 писал(а):У меня по мотивом моего неудавшегося фокуса появилась такая мысль: создать вспомогательную программу и передавать ей хендл нужного окна в качестве параметра. Затем запускать её обычным Shell по описанной схеме (за кулисами экрана), а она уже передаст фокус нужному окну и выгрузится :roll:

Если у тебя нет фокуса, когда запускаешь прогу, то она при запуске не получит фокус.
Всё железобетонно.
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 16.02.2009 (Пн) 0:08

Ага, я уже проверил :) (см. предыдущий топик)

Да ну и ладно, не больно-то и надо, это уже так, остаточное любопытство. Свою-то проблему я уже решил :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать так, чтобы моя программа потеряла фокус

Сообщение arthur2 » 16.02.2009 (Пн) 10:17

dr.MIG
А кстати - это действительно работает! Окно получает фокус, даже если запускающая программа не была активна!
Если в программе одно окно, то самое первое, что приходит в голову это SendKeys "%{TAB}", True


Проблема только в том, чтобы фокус передавался не кому-то вообще, а кому-то конкретному.

В общем, чтобы вернуть фокус себе из любого положения, сделал такой вот коктейль:

Код: Выделить всё
Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Sub cmn_Click()
    MsgBox "Через десять секунд, где бы ни находился фокус, он вернётся к нам :)"
    timer1.Interval = 10000
    timer1.Enabled = True
    Me.Visible = False
End Sub

Private Sub timer1_Timer()
    Show
    DoEvents
    SendKeys "%{TAB}", True
    DoEvents
    SetForegroundWindow hwnd 'себе. Ну или кому угодно :)
   
    Caption = "Сработало?" 'чтобы было видно в панели задач, если фокус не передастся :)
    timer1.Enabled = False
End Sub



Так что идея с подложным окном таки реализуема :)
Артур
 
   


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

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

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

    TopList