from __future__ import annotations
import sys
import warnings
from typing import Any
from typing import Coroutine
from typing import Literal
from typing import Optional
from typing import overload
from typing import Sequence
from typing import Tuple
from typing import TYPE_CHECKING
from typing import TypedDict
from typing import TypeVar
from typing import Union
from ahk._types import Position
from ahk.exceptions import WindowNotFoundException
if sys.version_info < (3, 10):
from typing_extensions import TypeAlias
else:
from typing import TypeAlias
if sys.version_info < (3, 11):
from typing_extensions import NotRequired
else:
from typing import NotRequired
if TYPE_CHECKING:
from .engine import AHK
from .transport import FutureResult
SyncPropertyReturnStr: TypeAlias = str
SyncPropertyReturnInt: TypeAlias = int
SyncPropertyReturnTupleIntInt: TypeAlias = Tuple[int, int]
SyncPropertyReturnBool: TypeAlias = bool
_PROPERTY_DEPRECATION_WARNING_MESSAGE = 'Use of the {0} property is not recommended (in the async API only) and may be removed in a future version. Use the get_{0} method instead.'
_SETTERS_REMOVED_ERROR_MESSAGE = (
'Use of the {0} property setter is not supported in the async API. Use the set_{0} instead.'
)
T_EngineVersion = TypeVar('T_EngineVersion', bound=Optional[Literal['v1', 'v2']])
[docs]class Window:
[docs] def __init__(self, engine: AHK[T_EngineVersion], ahk_id: str):
self._engine: AHK[T_EngineVersion] = engine
if not ahk_id:
raise ValueError(f'Invalid ahk_id: {ahk_id!r}')
self._ahk_id: str = ahk_id
def __repr__(self) -> str:
return f'<{self.__class__.__qualname__} ahk_id={self._ahk_id!r}>'
def __eq__(self, other: object) -> bool:
if not isinstance(other, Window):
return NotImplemented
return self._ahk_id == other._ahk_id
def __hash__(self) -> int:
return hash(self._ahk_id)
[docs] def close(self) -> None:
self._engine.win_close(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
return None
[docs] def kill(self) -> None:
self._engine.win_kill(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
[docs] def exists(self) -> bool:
return self._engine.win_exists(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
@property
def id(self) -> str:
return self._ahk_id
@property
def exist(self) -> SyncPropertyReturnBool:
return self.exists()
[docs] def get_pid(self) -> int:
pid = self._engine.win_get_pid(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
if pid is None:
raise WindowNotFoundException(
f'Error when trying to get PID of window {self._ahk_id!r}. The window may have been closed before the operation could be completed'
)
return pid
@property
def pid(self) -> SyncPropertyReturnInt:
return self.get_pid()
[docs] def get_process_name(self) -> str:
name = self._engine.win_get_process_name(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
if name is None:
raise WindowNotFoundException(
f'Error when trying to get process name of window {self._ahk_id!r}. The window may have been closed before the operation could be completed'
)
return name
@property
def process_name(self) -> SyncPropertyReturnStr:
return self.get_process_name()
[docs] def get_process_path(self) -> str:
path = self._engine.win_get_process_path(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
if path is None:
raise WindowNotFoundException(
f'Error when trying to get process path of window {self._ahk_id!r}. The window may have been closed before the operation could be completed'
)
return path
@property
def process_path(self) -> SyncPropertyReturnStr:
return self.get_process_path()
[docs] def get_minmax(self) -> int:
minmax = self._engine.win_get_minmax(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
if minmax is None:
raise WindowNotFoundException(
f'Error when trying to get minmax state of window {self._ahk_id}. The window may have been closed before the operation could be completed'
)
return minmax
[docs] def get_title(self) -> str:
title = self._engine.win_get_title(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
return title
@property
def title(self) -> SyncPropertyReturnStr:
return self.get_title()
@title.setter
def title(self, value: str) -> Any:
self.set_title(value)
[docs] def set_title(self, new_title: str) -> None:
self._engine.win_set_title(
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
new_title=new_title,
title_match_mode=(1, 'Fast'),
)
return None
[docs] def list_controls(self) -> Sequence['Control']:
controls = self._engine.win_get_control_list(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
if controls is None:
raise WindowNotFoundException(
f'Error when trying to enumerate controls for window {self._ahk_id}. The window may have been closed before the operation could be completed'
)
return controls
# fmt: off
@overload
def minimize(self) -> None: ...
@overload
def minimize(self, blocking: Literal[True]) -> None: ...
@overload
def minimize(self, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def minimize(self, blocking: bool = True) -> Optional[FutureResult[None]]: ...
# fmt: on
[docs] def minimize(self, blocking: bool = True) -> Optional[FutureResult[None]]:
return self._engine.win_minimize(
title=f'ahk_id {self._ahk_id}', title_match_mode=(1, 'Fast'), detect_hidden_windows=True, blocking=blocking
)
# fmt: off
@overload
def maximize(self) -> None: ...
@overload
def maximize(self, blocking: Literal[True]) -> None: ...
@overload
def maximize(self, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def maximize(self, blocking: bool = True) -> Optional[FutureResult[None]]: ...
# fmt: on
[docs] def maximize(self, blocking: bool = True) -> Optional[FutureResult[None]]:
return self._engine.win_maximize(
title=f'ahk_id {self._ahk_id}', title_match_mode=(1, 'Fast'), detect_hidden_windows=True, blocking=blocking
)
# fmt: off
@overload
def restore(self) -> None: ...
@overload
def restore(self, blocking: Literal[True]) -> None: ...
@overload
def restore(self, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def restore(self, blocking: bool = True) -> Optional[FutureResult[None]]: ...
# fmt: on
[docs] def restore(self, blocking: bool = True) -> Optional[FutureResult[None]]:
return self._engine.win_restore(
title=f'ahk_id {self._ahk_id}', title_match_mode=(1, 'Fast'), detect_hidden_windows=True, blocking=blocking
)
# fmt: off
@overload
def get_class(self) -> str: ...
@overload
def get_class(self, blocking: Literal[True]) -> str: ...
@overload
def get_class(self, blocking: Literal[False]) -> FutureResult[str]: ...
@overload
def get_class(self, blocking: bool = True) -> Union[str, FutureResult[str]]: ...
# fmt: on
[docs] def get_class(self, blocking: bool = True) -> Union[str, FutureResult[str]]:
return self._engine.win_get_class(
title=f'ahk_id {self._ahk_id}', detect_hidden_windows=True, title_match_mode=(1, 'Fast'), blocking=blocking
)
# fmt: off
@overload
def set_always_on_top(self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0]) -> None: ...
@overload
def set_always_on_top(self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0], *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def set_always_on_top(self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0], *, blocking: Literal[True]) -> None: ...
@overload
def set_always_on_top(self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0], *, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def set_always_on_top(
self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0], *, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.win_set_always_on_top(
toggle=toggle,
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def is_always_on_top(self) -> bool: ...
@overload
def is_always_on_top(self, *, blocking: Literal[False]) -> FutureResult[Optional[bool]]: ...
@overload
def is_always_on_top(self, *, blocking: Literal[True]) -> bool: ...
@overload
def is_always_on_top(self, *, blocking: bool = True) -> Union[bool, FutureResult[Optional[bool]]]: ...
# fmt: on
[docs] def is_always_on_top(self, *, blocking: bool = True) -> Union[bool, FutureResult[Optional[bool]]]:
args = [f'ahk_id {self._ahk_id}']
resp = self._engine._transport.function_call(
'AHKWinIsAlwaysOnTop', args, blocking=blocking
) # XXX: maybe shouldn't access transport directly?
if resp is None:
raise WindowNotFoundException(
f'Error when trying to get always on top style for window {self._ahk_id}. The window may have been closed before the operation could be completed'
)
return resp
@property
def always_on_top(self) -> SyncPropertyReturnBool:
return self.is_always_on_top()
@always_on_top.setter
def always_on_top(self, toggle: Literal['On', 'Off', 'Toggle', 1, -1, 0]) -> Any:
self.set_always_on_top(toggle)
# fmt: off
@overload
def send(self, keys: str, control: str = '') -> None: ...
@overload
def send(self, keys: str, control: str = '', *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def send(self, keys: str, control: str = '', *, blocking: Literal[True]) -> None: ...
@overload
def send(self, keys: str, control: str = '', *, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def send(
self, keys: str, control: str = '', *, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.control_send(
keys=keys,
control=control,
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def click(self, x: int = 0, y: int = 0, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '') -> None: ...
@overload
def click(self, x: int = 0, y: int = 0, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def click(self, x: int = 0, y: int = 0, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', blocking: Literal[True]) -> None: ...
@overload
def click(self, x: int = 0, y: int = 0, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def click(
self,
x: int = 0,
y: int = 0,
*,
button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L',
click_count: int = 1,
options: str = '',
blocking: bool = True,
) -> Union[None, FutureResult[None]]:
pos = f'X{x} Y{y}'
return self._engine.control_click(
control=pos,
title=f'ahk_id {self._ahk_id}',
button=button,
click_count=click_count,
options=options,
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def get_text(self) -> str: ...
@overload
def get_text(self, *, blocking: Literal[False]) -> FutureResult[str]: ...
@overload
def get_text(self, *, blocking: Literal[True]) -> str: ...
@overload
def get_text(self, *, blocking: bool = True) -> Union[str, FutureResult[str]]: ...
# fmt: on
[docs] def get_text(self, *, blocking: bool = True) -> Union[str, FutureResult[str]]:
return self._engine.win_get_text(
title=f'ahk_id {self._ahk_id}', blocking=blocking, detect_hidden_windows=True, title_match_mode=(1, 'Fast')
)
@property
def text(self) -> SyncPropertyReturnStr:
return self.get_text()
# fmt: off
@overload
def get_position(self) -> Position: ...
@overload
def get_position(self, *, blocking: Literal[False]) -> FutureResult[Optional[Position]]: ...
@overload
def get_position(self, *, blocking: Literal[True]) -> Position: ...
@overload
def get_position(self, *, blocking: bool = True) -> Union[Position, FutureResult[Optional[Position]], FutureResult[Position]]: ...
# fmt: on
[docs] def get_position(
self, *, blocking: bool = True
) -> Union[Position, FutureResult[Optional[Position]], FutureResult[Position]]:
resp = self._engine.win_get_position( # type: ignore[misc] # this appears to be a mypy bug
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
if resp is None:
raise WindowNotFoundException(
f'Error when trying to get position for window {self._ahk_id}. The window may have been closed before the operation could be completed'
)
return resp
# fmt: off
@overload
def activate(self) -> None: ...
@overload
def activate(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def activate(self, *, blocking: Literal[True]) -> None: ...
@overload
def activate(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def activate(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
resp = self._engine.win_activate(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
return resp
# fmt: off
@overload
def to_bottom(self, *, blocking: Literal[True]) -> None: ...
@overload
def to_bottom(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def to_bottom(self) -> None: ...
# fmt: on
[docs] def to_bottom(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_set_bottom(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def to_top(self, *, blocking: Literal[True]) -> None: ...
@overload
def to_top(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def to_top(self) -> None: ...
# fmt: on
[docs] def to_top(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_set_top(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def show(self, *, blocking: Literal[True]) -> None: ...
@overload
def show(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def show(self) -> None: ...
# fmt: on
[docs] def show(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_show(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def hide(self, *, blocking: Literal[True]) -> None: ...
@overload
def hide(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def hide(self) -> None: ...
# fmt: on
[docs] def hide(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_hide(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def disable(self, *, blocking: Literal[True]) -> None: ...
@overload
def disable(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def disable(self) -> None: ...
# fmt: on
[docs] def disable(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_set_disable(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def enable(self, *, blocking: Literal[True]) -> None: ...
@overload
def enable(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def enable(self) -> None: ...
# fmt: on
[docs] def enable(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_set_enable(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
# fmt: off
@overload
def redraw(self, *, blocking: Literal[True]) -> None: ...
@overload
def redraw(self, *, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def redraw(self) -> None: ...
@overload
def redraw(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def redraw(self, *, blocking: bool = True) -> Union[None, FutureResult[None]]:
return self._engine.win_set_redraw(
title=f'ahk_id {self._ahk_id}',
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
@overload
def set_style(self, style: str) -> bool: ...
@overload
def set_style(self, style: str, *, blocking: Literal[True]) -> bool: ...
@overload
def set_style(self, style: str, *, blocking: Literal[False]) -> FutureResult[bool]: ...
@overload
def set_style(self, style: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]: ...
[docs] def set_style(self, style: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]:
return self._engine.win_set_style(
style=style,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
@overload
def set_ex_style(self, style: str) -> bool: ...
@overload
def set_ex_style(self, style: str, *, blocking: Literal[False]) -> FutureResult[bool]: ...
@overload
def set_ex_style(self, style: str, *, blocking: Literal[True]) -> bool: ...
@overload
def set_ex_style(self, style: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]: ...
[docs] def set_ex_style(self, style: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]:
return self._engine.win_set_ex_style(
style=style,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
@overload
def set_region(self, options: str) -> bool: ...
@overload
def set_region(self, options: str, *, blocking: Literal[True]) -> bool: ...
@overload
def set_region(self, options: str, *, blocking: Literal[False]) -> FutureResult[bool]: ...
@overload
def set_region(self, options: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]: ...
[docs] def set_region(self, options: str, *, blocking: bool = True) -> Union[bool, FutureResult[bool]]:
return self._engine.win_set_region(
options=options,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
[docs] def set_transparent(
self, transparency: Union[int, Literal['Off']], *, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.win_set_transparent(
transparency=transparency,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
[docs] def set_trans_color(
self, color: Union[int, str], *, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.win_set_trans_color(
color=color,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
@property
def active(self) -> SyncPropertyReturnBool:
return self.is_active()
[docs] def is_active(self) -> bool:
return self._engine.win_is_active(
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
)
[docs] def move(
self, x: int, y: int, *, width: Optional[int] = None, height: Optional[int] = None, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.win_move(
x=x,
y=y,
width=width,
height=height,
title=f'ahk_id {self._ahk_id}',
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
blocking=blocking,
)
[docs] @classmethod
def from_pid(cls, engine: AHK[Any], pid: int) -> Optional[Window]:
return engine.win_get(title=f'ahk_pid {pid}')
[docs] @classmethod
def from_mouse_position(cls, engine: AHK[Any]) -> Optional[Window]:
return engine.win_get_from_mouse_position()
_ControlTargetKwargs = TypedDict('_ControlTargetKwargs', {'title': str, 'control': NotRequired[str]})
[docs]class Control:
[docs] def __init__(self, window: Window, hwnd: str, control_class: str):
self.window: Window = window
self.hwnd: str = hwnd
self.control_class: str = control_class
self._engine = window._engine
self.use_hwnd: bool = False
def _get_target_params(self, use_hwnd: Optional[bool] = None) -> _ControlTargetKwargs:
if use_hwnd is None:
use_hwnd = self.use_hwnd
if use_hwnd:
return {'title': f'ahk_id {self.hwnd}'}
else:
return {'title': f'ahk_id {self.window._ahk_id}', 'control': self.control_class}
# fmt: off
@overload
def click(self, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', use_hwnd: Optional[bool] = None) -> None: ...
@overload
def click(self, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', use_hwnd: Optional[bool] = None, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def click(self, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', use_hwnd: Optional[bool] = None, blocking: Literal[True]) -> None: ...
@overload
def click(self, *, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', use_hwnd: Optional[bool] = None, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def click(
self,
*,
button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L',
click_count: int = 1,
options: str = '',
use_hwnd: Optional[bool] = None,
blocking: bool = True,
) -> Union[None, FutureResult[None]]:
return self._engine.control_click(
button=button,
click_count=click_count,
options=options,
title_match_mode=(1, 'Fast'),
detect_hidden_windows=True,
blocking=blocking,
**self._get_target_params(use_hwnd),
)
# fmt: off
@overload
def send(self, keys: str, *, use_hwnd: Optional[bool] = None) -> None: ...
@overload
def send(self, keys: str, *, use_hwnd: Optional[bool] = None, blocking: Literal[False]) -> FutureResult[None]: ...
@overload
def send(self, keys: str, *, use_hwnd: Optional[bool] = None, blocking: Literal[True]) -> None: ...
@overload
def send(self, keys: str, *, use_hwnd: Optional[bool] = None, blocking: bool = True) -> Union[None, FutureResult[None]]: ...
# fmt: on
[docs] def send(
self, keys: str, *, use_hwnd: Optional[bool] = None, blocking: bool = True
) -> Union[None, FutureResult[None]]:
return self._engine.control_send(
keys=keys,
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
**self._get_target_params(use_hwnd),
)
[docs] def get_text(
self, *, use_hwnd: Optional[bool] = None, blocking: bool = True
) -> Union[str, FutureResult[str]]:
return self._engine.control_get_text(
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
**self._get_target_params(use_hwnd),
)
# fmt: off
@overload
def get_position(self, *, use_hwnd: Optional[bool] = None) -> Position: ...
@overload
def get_position(self, *, use_hwnd: Optional[bool] = None, blocking: Literal[False]) -> FutureResult[Position]: ...
@overload
def get_position(self, *, use_hwnd: Optional[bool] = None, blocking: Literal[True]) -> Position: ...
@overload
def get_position(self, *, use_hwnd: Optional[bool] = None, blocking: bool = True) -> Union[Position, FutureResult[Position]]: ...
# fmt: on
[docs] def get_position(
self, *, use_hwnd: Optional[bool] = None, blocking: bool = True
) -> Union[Position, FutureResult[Position]]:
return self._engine.control_get_position(
blocking=blocking,
detect_hidden_windows=True,
title_match_mode=(1, 'Fast'),
**self._get_target_params(use_hwnd),
)
def __repr__(self) -> str:
return f'<{self.__class__.__name__} window={self.window!r}, control_hwnd={self.hwnd!r}, control_class={self.control_class!r}>'