Что нового

[Элементы GUI] Несовместимость GUICtrlCreateEdit() с GUIRegisterMsg($WM_KILLFOCUS, 'Func'.)

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Вот возникла такая проблема:
Код:
#include <GUIConstants.au3>
$gui = GUICreate (@ScriptName)
GUIRegisterMsg (0x0008, "KillFocus")
GUICtrlCreateEdit('Я такая бяка! Я не дам запустить функцию KillFocus()', 5, 5, 350, 350)
GUISetState (@SW_SHOW, $gui)
Do
    $msg = GUIGetMsg ($gui)
Until $msg = $gui_event_close

Func KillFocus()
	MsgBox (0, @ScriptName, 'Ой!! Фокус потерялся...')
EndFunc

При потере фокуса должно вылазить сообщение, но оно появляется только при запуске скрипта, после чего - тишина. Зато, если закомментировать,
Код:
; GUICtrlCreateEdit('Я такая бяка! Я не дам запустить функцию KillFocus()', 5, 5, 350, 350)
то все работает.

Что это может быть и как с этим бороться? Может кто подскажет? У кого какие мысли?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Pelerin [?]
Что это может быть и как с этим бороться?
Потеря фокуса окна при созданий другого (Edit это тоже своего рода окно).
А бороться с этим просто:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate(@ScriptName)
GUICtrlCreateEdit('Я такая бяка! Я не дам запустить функцию KillFocus()', 5, 5, 350, 350)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_KILLFOCUS, "KillFocus")

Do
    $nMsg = GUIGetMsg($hGUI)
Until $nMsg = $GUI_EVENT_CLOSE

Func KillFocus($hWnd, $nMsg, $wParam, $lParam)
	;Не очень хорошая идея вызывать MsgBox из этой функций
    ;MsgBox (0, @ScriptName, 'Ой!! Фокус потерялся...')
	ConsoleWrite('Ой!! Фокус потерялся... сфокусированное окно (элемент): ' & @LF & WinGetTitle($wParam) & @LF)
	Return 0
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Pelerin

WM_KILLFOCUS приходит при потере фокуса ввода, а тебе, как я понимаю, нужно определить деактивацию окна - WM_ACTIVATE. Читай MSDN.
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Yashied, спасибо!
Помогло вот это:
Код:
#include <GUIConstants.au3>
$gui = GUICreate (@ScriptName)
GUIRegisterMsg (0x0006, "KillFocus") ; регистрация функции на $WM_Activate
$edit = GUICtrlCreateEdit('Я такая бяка! Я не дам запустить функцию KillFocus()', 5, 5, 350, 350)
GUISetState (@SW_SHOW, $gui)
Do
    $msg = GUIGetMsg ($gui)
Until $msg = $gui_event_close

Func KillFocus()
	If WinGetState ($gui) = 7 Then ; если фокус таки потерялся...
		ConsoleWrite('Ой!! Фокус потерялся...'&@CRLF)
	EndIf
EndFunc


А нет ли способа вытянуть в AutoIt подробную информацию о сообщении $WM_Activate и вызывать KillFocus только при потере активности, а не как сейчас при каждом её изменении, а внутри функции проверять состояние окна? MSDN почитал, но мало помогло. Надо вчитываться...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Несовместимость GUICtrlCreateEdit() с GUIRegisterMsg($WM_KILLFOCUS, \'Func\'.)

Pelerin [?]
А нет ли способа вытянуть в AutoIt подробную информацию о сообщении $WM_Activate
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$gui = GUICreate(@ScriptName)
GUIRegisterMsg($WM_ACTIVATE, "KillFocus") ; регистрация функции на $WM_Activate
$edit = GUICtrlCreateEdit('Я такая бяка! Я не дам запустить функцию KillFocus()', 5, 5, 350, 350)
GUISetState(@SW_SHOW, $gui)

Do
    $msg = GUIGetMsg($gui)
Until $msg = $gui_event_close

Func KillFocus($hWnd, $nMsg, $wParam, $lParam)
	Local $iActive = _WinAPI_LoWord($wParam)
	
    If Not $iActive Then ; если фокус таки потерялся...
        ConsoleWrite('Ой!! Фокус потерялся...'&@CRLF)
    EndIf
	
	Return 0
EndFunc



Добавлено:
Сообщение автоматически объединено:

Pelerin [?]
вызывать KillFocus только при потере активности
Зачем?
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
CreatoR,
Ну так... для оптимизации что ли... Хотя не сильно то и надо, но на душе спокойнее... :angel:
Код:
Local $iActive = _WinAPI_LoWord($wParam)
В общем то, это тоже самое что и в моей версии. Я думал может у функции GUIRegisterMSG() есть какой-нибудь "хитрый" параметр для уточнения параметров сообщений.

Тему можно считать решенной.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот так правильно будет.

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

$hForm = GUICreate('MyGUI', 400, 400)
$Edit = GUICtrlCreateEdit('', 5, 5, 350, 350)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch BitAND($wParam, 0xFFFF)
				Case 0 ; WA_INACTIVE
					ConsoleWrite('Deactivate' & @CR)
				Case 1, 2 ; WA_ACTIVE, WA_CLICKACTIVE
					ConsoleWrite('Activate' & @CR)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_ACTIVATE
 
Верх