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


Автор: Voldemar2004 18.11.2005, 19:45
При нажатии кнопки форма должна потерять фокус, как сделать?

Автор: darkart 18.11.2005, 21:16
SendMessage с WM_KILLFOCUS.

Автор: Voldemar2004 19.11.2005, 13:09
Код
Option Explicit

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWndParrent As Long, ByVal hWndChildren As Long, ByVal lpClassName As String, ByVal lpWindowName As String)

Private Sub Command1_Click()
Dim sCaption As String, hW As String

Const WM_KILLFOCUS = &H8

sCaption = "Form1"
hW = FindWindow(vbNullString, sCaption)

' Как заставить работать эту строку:
Call SendMessage(hW, WM_KILLFOCUS, <ByVal???> , 1)

End Sub


Автор: Exception 19.11.2005, 15:33
Насколько я знаю, WM_KILLFOCUS не убирает фокус, а используется виндой
для оповещения окна, что у него отбирают фокус. Чтобы убрать у формы фокус, придай его десктопу:
Код
Sub MySub()
Dim deskhw As Long
deskhw = GetDesktopWindow()
SetForegroundWindow deskhw
End Sub

Объявления API-функций я опустил, смотри в API Viewer'е

Автор: Voldemar2004 19.11.2005, 20:05
Run-time error, + smile . Все, что ниже - переключает фокус с VB-программы на программу с указанным заголовком:
Код
Option Explicit

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWndParrent As Long, ByValhWndChildren As Long, ByVal lpClassName As String, ByVal lpWindowName As String)

Private Declare Function SetForegroundWindow _
Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetDesktopWindow _
Lib "user32" () As Long

Dim hw As String

Private Sub Command1_Click()
Dim sCaption As String ', hw As String
Const WM_KILLFOCUS = &H8

sCaption = "Программа для работы с БД (ДОС)" ' можно узнавать заголовок с помощью функции,
' но в моем случае хватит и этого

hw = FindWindow(vbNullString, sCaption)

MsgBox hw

MySub

End Sub

Sub MySub()
Dim deskhw As Long
deskhw = hw 'GetDesktopWindow()
SetForegroundWindow deskhw
End Sub
Я просто не знал про ф-цию SetForegroundWindow.

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