Активно ли окно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Активно ли окно

Сообщение StimorolD3DX » 29.04.2007 (Вс) 13:04

Как проверить активно ли окно, тоесть имеет ли оно фокус?
Пробовал: Form_LostFocus, Form_GotFocus не помагает...
:o

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.04.2007 (Вс) 13:16

Get(Active|Foreground)Window
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.04.2007 (Вс) 16:58

Задам свой вопрос тут, чтобы не создавать новый топик. Как сделать окно активным? Я пробовал:
SetActiveWindow
SetForegroundWindow
BringWindowToTop
SendMessage (WM_ACTIVATE, WM_ACTIVATEAPP)

Результат один - нужное мне окно начинает мигать в таксбаре, активным не становится. Я что-то упустил, или это какая-то настройка системы, или это нормально ?

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

Сообщение tyomitch » 29.04.2007 (Вс) 17:18

Да, это нормально.
Бешено бесят проги, которые воруют у меня фокус.
Пусть лучше мигают.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.04.2007 (Вс) 17:33

Фокус возвращаю своей проге, а не чужой.
Неужели нельзя "своровать"?

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

Сообщение GSerg » 29.04.2007 (Вс) 17:35

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

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.04.2007 (Вс) 17:38

Да нет же) Пользователь осознанно нажимает удобное сочетание клавиш, чтоб сразу вводить текст в моей проге.

(Неужели это так важно?)

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

Сообщение tyomitch » 29.04.2007 (Вс) 20:35

Даже страшно представить, как ты ловишь эту комбинацию клавиш -- GetAsyncKeyState в цикле? :roll:

Активная прога может отдать фокус кому захочет. Если она и правда твоя, то пусть активирует другую твою прогу.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.04.2007 (Вс) 20:53

не в цикле, а в таймере.
неактивная прога не может кинуть фокус вообще?

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 29.04.2007 (Вс) 22:15

легко: нужно свернуть (windowstate=1) и развернуть (windowstate=0) окно своей программы, и она станет активна! :)

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

Сообщение tyomitch » 29.04.2007 (Вс) 22:36

nekeda писал(а):не в цикле, а в таймере.

Отвратительно. Про RegisterHotKey не слышал?


Cytron, кончай нести чушь.
Сам-то проверял, раньше чем советовать?
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.04.2007 (Вс) 23:32

Про RegisterHotKey не слышал?


не слышал. А чем плоха GetAsyncKeyState?

И правельно ли я понял что windows позволяет передать фокус другому окну, только если передаёт его активное окно?

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

Сообщение tyomitch » 30.04.2007 (Пн) 0:23

nekeda писал(а):
Про RegisterHotKey не слышал?


не слышал. А чем плоха GetAsyncKeyState?

Необходимостью опроса в цикле.

nekeda писал(а):И правельно ли я понял что windows позволяет передать фокус другому окну, только если передаёт его активное окно?

Да.
Изображение

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 30.04.2007 (Пн) 9:38

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

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.04.2007 (Пн) 15:09

Во! Это идея :)

Поведение действительно наглое, но в данном случае оно необходимо тем, кто пользуется программой.

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

Сообщение tyomitch » 30.04.2007 (Пн) 15:33

:roll: Свят, свят...
Лучше бы ты заюзал RegisterHotKey.
Она создана специально для того, что ты пытаешься устроить.
Наверняка она и вытащить окно наверх из своего обработчика даст.
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.04.2007 (Пн) 19:19

tyomitch
я попробую :roll:

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 30.04.2007 (Пн) 19:40

tyomitch писал(а):Cytron, кончай нести чушь.
Сам-то проверял, раньше чем советовать?

проверял и у меня все работает :twisted:

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 01.05.2007 (Вт) 9:45

tyomitch
посомтрел пример..
http://www.vb.kiev.ua/ref/w32api/showdo ... sterhotkey
Там тоже используется цикл.

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

Сообщение tyomitch » 01.05.2007 (Вт) 10:10

Ну значит, такой пример корявый.
Вот тебе отлично работающий, без циклов и без левых хаков вытаскивающий нужное окно наверх.

Код: Выделить всё
Option Explicit

Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = -4

Private Sub Form_Load()
RegisterHotKey hWnd, 0, vbCtrlMask, vbKeyA
OldWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub


Код: Выделить всё
Option Explicit

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Const WM_HOTKEY = &H312
Public OldWindowProc As Long

Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
    SetForegroundWindow hWnd
    MsgBox "Ку-ку!"
Else
    WndProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End If
End Function
Изображение

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 01.05.2007 (Вт) 15:01

tyomitch
спасибо, то что надо! :)


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 45

    TopList