Что нового

[Баг] ControlGetFocus - Блокирует ввод мышки

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Простой пример:

Код:
AdlibRegister("_exit", 5000)

While 1
	$sClass = ControlGetFocus("[CLASS:CabinetWClass]")
	Sleep(10)
WEnd

Func _exit()
	Exit
EndFunc


В цикле проверяется фокусирование элемента (у окна Explorer'а на WinXP), но при этом нет возможности сделать двойной клик по файлу/папке, как будто блокируется чем то.

Прошу подтвердить, а также хотел бы узнать чем это можно заменить, чтобы обойти эту проблему.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: ControlGetFocus - Блокирует ввод мышки

CreatoR [?]
Прошу подтвердить
Да действительно, блокирует. Win XP SP2

а также хотел бы узнать чем это можно заменить
Если задача состоит в том чтобы держать окно в фокусе, то я нашёл такой вариант.
Код:
#Include <WinAPI.au3>
Dim $iFocus = 0

AdlibRegister("_exit", 10000)

WinActivate("[CLASS:CabinetWClass]")

While 1
	If WinActive("[CLASS:CabinetWClass]") And $iFocus Then
		ConsoleWrite($sClass & @CRLF)
	Else
		$iFocus = Not $iFocus
		WinActivate("[CLASS:CabinetWClass]")
		$sClass = ControlGetFocus("[CLASS:CabinetWClass]")
		ConsoleWrite($sClass & @CRLF)	
	EndIf
    Sleep(10)
WEnd

Func _exit()
    Exit
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: ControlGetFocus - Блокирует ввод мышки

Garrett [?]
Если задача состоит в том чтобы держать окно в фокусе, то я нашёл такой вариант
Нет, задача как раз в том чтобы просто отследить фокусирование, т.е мне нужно определить не сфокусирован ли некий элемент (Edit1). Вообще в целом пытаюсь отследить событие переименования файла/папки в Explorer'е.
 

Sniper

Новичок
Сообщения
23
Репутация
1
Re: ControlGetFocus - Блокирует ввод мышки

CreatoR

Win XP SP3 - Не блокируется, двойные клики работают
 

Yashied

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

Вот примерно то, что делает функция ControlGetFocus(). Чтобы получить фокус чужого приложения, нужно присоединиться к его потоку ввода. На это время и возникают глюки. Правда можно увеличить задержку...

Код:
#Include <WinAPI.au3>

AdlibRegister("_exit", 10000)

While 1
	ConsoleWrite(_ControlGetFocus("[CLASS:CabinetWClass]") & @CR)
;	ConsoleWrite(ControlGetHandle(WinGetHandle(''), '', ControlGetFocus("[CLASS:CabinetWClass]")) & @CR)
    Sleep(100)
WEnd

Func _exit()
    Exit
EndFunc

Func _ControlGetFocus($hWnd)

	Local $aID, $mID, $iPID

	$hWnd = WinGetHandle($hWnd)
	If $hWnd Then
		$aID = _WinAPI_GetWindowThreadProcessId($hWnd, $iPID)
		$mID = _WinAPI_GetCurrentThreadId()
		If _WinAPI_AttachThreadInput($aID, $mID, 1) Then
			$hWnd = _WinAPI_GetFocus()
			_WinAPI_AttachThreadInput($aID, $mID, 0)
		Else
			$hWnd = 0
		EndIf
	EndIf
	Return $hWnd
EndFunc   ;==>_ControlGetFocus
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: ControlGetFocus - Блокирует ввод мышки

Yashied [?]
Правда можно увеличить задержку
Вот это как раз нужно обойти, мне нужно как можно быстрее вернуться из функций и сообщить что элемент сфокусирован.

Пример выше также блокирует двойное нажатие :(.

Sniper [?]
Win XP SP3 - Не блокируется
У меня SP2, интересно что там поменялось в этом плане...


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

Sniper [?]
Win XP SP3 - Не блокируется, двойные клики работают
Какой CLASS у окна Explorer'а?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: ControlGetFocus - Блокирует ввод мышки

CreatoR
Windows XP SP3x86 блокируются. У меня.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: ControlGetFocus - Блокирует ввод мышки

Прошу подтвердить, а также хотел бы узнать чем это можно заменить, чтобы обойти эту проблему.

На Windows XP SP3 Х86 блокируется.
Можно попробовать обойти следя за контролом ListView

Код:
#Include <GuiListView.au3>

AdlibRegister("_exit", 10000)

While 1
	$hWnd = WinGetHandle('[ACTIVE]')
	If WinGetProcess($hWnd) = ProcessExists('explorer.exe') Then
		$hCtrl = ControlGetHandle($hWnd, '', '[CLASS:SysListView32]')
		If $hCtrl Then
			While WinGetHandle('[ACTIVE]') = $hWnd
				If _GUICtrlListView_GetEditControl($hCtrl) Then
					ConsoleWrite('--- --->' & @CRLF)
				EndIf
				Sleep(10)
			WEnd
		EndIf
	EndIf
	Sleep(10)
WEnd

Func _exit()
	Exit
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
Можно попробовать обойти следя за контролом ListView
Хорошое решение, спасибо.
Правда я уже обошёлся более корректным решением, на офф. форуме нашёл скрипт для отслеживания разных событий системы, в том числе и фокусирование Edit в Explorer'е.

P.S
Кстати, проблема не только в ControlGetFocus, но и в ControlGetText, видимо там тот же механизм подключения к процессу как и у GetFocus.
 
Верх