Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Не работает GetActiveWindow


Автор: Mephisto 29.3.2004, 17:24
Столкнулся со следующей проблемой:
Использую функцию WinAPI GetActiveWindow, но она возвращает hWnd только моей формы (если она активна). Вопрос: Каким образом можно узнать hWnd формы с которой работает Windows?

Автор: cardinal 30.3.2004, 01:30
MSDN:
Цитата
GetForegroundWindow
The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads.

HWND GetForegroundWindow(VOID)

Parameters
This function has no parameters.

Return Values
The return value is a handle to the foreground window.

Объявлять так:
Код
Private Declare Function GetForegroundWindow Lib "user32" () As Long

Использовать так:
Код
Dim hWndActive As Long
 
' получаешь handle на active/foreground окно
hWndActive = GetForegroundWindow()

Для того чтобы затормозить процесс, например, на 2 секунды и сделать то окно активным, от которого ты хочешь handle можешь написать что-нибудь на подобии:
Код
Dim EndTime As Date

MsgBox "Две секунды после закрытия этого окна ты получишь handle."

' ждешь две секунды
EndTime = DateAdd("s", 2, Now)
Do Until Now > EndTime
   DoEvents
Loop

Вот полный исходник:
Код
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function PostMessage Lib "user32" _
               Alias "PostMessageA" (ByVal hwnd As Long, _
                                     ByVal wMsg As Long, _
                                     ByVal wParam As Long, _
                                     ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10

Private Sub Command1_Click()
Dim hWndActive As Long
Dim EndTime As Date

MsgBox "Две секунды после закрытия этого окна ты получишь handle."

' ждешь две секунды
EndTime = DateAdd("s", 2, Now)
Do Until Now > EndTime
   DoEvents
Loop
 
' получаешь handle на active/foreground окно
hWndActive = GetForegroundWindow()

' PostMessage hWndActive, WM_CLOSE, 0, 0 ' это ответ на твой второй вопрос
End Sub

Автор: Mephisto 30.3.2004, 17:43
Код
PostMessage hWndActive, WM_CLOSE, 0, 0 ' это ответ на твой второй вопрос

Я так понял это корректное завершение приложения. Мея нтересовал немного другой вопрос. Завершения приложения без запроса на сохронение и.т.д. Данную прогу я хочу установить на свой комп и при помощи сокета иногда просматривать запущенные приложения через сеть. Ну естественно выгружать ненужные, если таковые будут. Для этого мне понадобится не совсем корректный выход из приложения. Но я обязательно испробую твой вариант. Его я ещё не пробовал. Спасибо, очень толково написано.
Код
EndTime = DateAdd("s", 2, Now)
Do Until Now > EndTime
  DoEvents
Loop

Чесно, еще не встречал такой записи. Прикольно.
Читал твой код поповоду асма. http://forum.vingrad.ru/index.php?showtopic=15962.

Автор: cardinal 6.4.2004, 16:58
тогда так:
Код
PostMessage hWndActive, WM_QUIT, 0, 0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)