gyp2000 发表于 2023-11-9 19:20:48

[已解决]如何获取浏览器的键盘焦点。

本帖最后由 gyp2000 于 2023-11-25 20:31 编辑

用下边的代码可以获取大部分窗口的键盘焦点。

但是查询到浏览器(Edge、谷歌、火狐)的时候就无效果。无法操作或取消浏览器的键盘焦点。

#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Global $g_tRECT, $g_iIndex, $g_hMenu = 0
Global $hForm, $hEventProc, $hEventHook, $a_idInput

Example()

Func Example()
      $hForm = GUICreate('', 240, 268, 10, 10, BitOR($WS_CAPTION, $WS_POPUP), $WS_EX_TOPMOST)
      GUICtrlCreateLabel('线程状态:', 20, 18, 90, 14)
      GUICtrlCreateLabel('活动窗口:', 20, 40, 90, 14)
      GUICtrlCreateLabel('键盘焦点:', 20, 62, 90, 14)
      GUICtrlCreateLabel('鼠标捕获:', 20, 84, 90, 14)
      GUICtrlCreateLabel('活动菜单:', 20, 106, 90, 14)
      GUICtrlCreateLabel('移动或大小循环:', 20, 128, 90, 14)
      GUICtrlCreateLabel('插入符号:', 20, 150, 90, 14)
      GUICtrlCreateLabel('左距:', 20, 172, 90, 14)
      GUICtrlCreateLabel('顶距:', 20, 194, 90, 14)
      GUICtrlCreateLabel('宽度:', 20, 216, 90, 14)
      GUICtrlCreateLabel('高度:', 20, 238, 90, 14)

      For $i = 0 To 10
                $a_idInput[$i] = GUICtrlCreateLabel('', 114, 18 + 22 * $i, 116, 14)
      Next
      GUISetState(@SW_SHOWNOACTIVATE)
      $hEventProc = DllCallbackRegister('_EventProc', 'none', 'ptr;dword;hwnd;long;long;dword;dword')
      $hEventHook = _WinAPI_SetWinEventHook($EVENT_SYSTEM_FOREGROUND, $EVENT_OBJECT_FOCUS, DllCallbackGetPtr($hEventProc))
      OnAutoItExitRegister('OnAutoItExit')

      Do

      Until GUIGetMsg() = $GUI_EVENT_CLOSE

EndFunc   ;==>Example

Func _EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime)
      #forceref $hEventHook, $iObjectID, $iChildID, $iThreadId, $iEventTime
      Local $aInfo
      If $iEvent = $EVENT_OBJECT_FOCUS Or $iEvent = $EVENT_SYSTEM_FOREGROUND Then
                $aInfo = _WinAPI_GetGUIThreadInfo(Null)
                For $i = 0 To 10
                        If StringCompare(GUICtrlRead($a_idInput[$i]), $aInfo[$i]) Then
                              GUICtrlSetData($a_idInput[$i], $aInfo[$i])
                        EndIf
                Next
                WinSetTitle($hForm, '', WinGetTitle($hWnd))
      EndIf
EndFunc   ;==>_EventProc

Func OnAutoItExit()
      _WinAPI_UnhookWinEvent($hEventHook)
      DllCallbackFree($hEventProc)
EndFunc   ;==>OnAutoItExit
是不是浏览器接管了键盘焦点管理,无法通过外部方法干预。

gyp2000 发表于 2023-11-25 20:33:46

应该是无解,浏览器接管了键盘。
页: [1]
查看完整版本: [已解决]如何获取浏览器的键盘焦点。