Что нового

[Автоматизация] Хук горячей клавиши

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Заинтересовал вопрос можно ли перехватить нажатие клавиши ENTER в нужном мне окне, и вызвать функцию, а если окно неактивно - не выполнять такой перехват. Написал такой скрипт:
Код:
#RequireAdmin
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.0
 Author:         S1R1US[B.S.]

 Script Function:
	MTRD Messenger Client.

#ce ----------------------------------------------------------------------------
#include <ButtonConstants.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#Include <GuiEdit.au3>
#include <Misc.au3>
#NoTrayIcon

$g_IP = InputBox("Messenger Client","Введите адрес сервера",@IPADDRESS1,"",300,200) ; конфигурируем вход на сервер
$g_port = 33891 ; открываем сокет для передачи данных

; Запуск TCP службы
;==============================================
TCPStartUp()

; Подключение к сокету сервера
;==============================================
$socket = TCPConnect( $g_IP, $g_port )
If $socket = -1 Then Exit

Global $True=False

HotKeySet("{enter}", "_Send")

Opt("TrayOnEventMode",1) ; трей в режиме событий
Opt("TrayMenuMode",1)   ; нестандартное меню отображения трея

$GOOEY = GUICreate("messenger - " & @ComputerName, 500, 600)  ; создаем гуй
GUISetBkColor (0xFFFFFF)
$input = GUICtrlCreateInput ("", 10,420,480,130, $ES_MULTILINE + $ES_AUTOVSCROLL + $WS_VSCROLL)
$edit = GUICtrlCreateEdit ("", 10,10,480,400, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN + $ES_READONLY)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetColor(-1, 0x0)
GUICtrlSendMsg($edit, $EM_LIMITTEXT, -1, 0) ; снимает ограничение на количество символов 30 000
$otpravka = GUICtrlCreateButton("ОТПРАВИТЬ", 10,560,80,30)
GUICtrlSetBkColor(-1, 0x9ACD32)
GUICtrlSetColor(-1, 0x0)
GUICtrlSetTip ($otpravka, "Отправить ваше сообщение")
$ochistka = GUICtrlCreateButton("ОЧИСТИТЬ", 90, 560, 80, 30)
GUICtrlSetBkColor(-1, 0xF08000)
GUICtrlSetColor(-1, 0x0)
GUICtrlSetTip ($ochistka, "Очистить чат")
$sendfile = GUICtrlCreateButton("", 450, 560, 40, 30, $BS_BITMAP)
GUICtrlSetImage(-1, "5.bmp")
GUICtrlSetTip ($sendfile, "Отправить файл")
TraySetClick(16)    ; трей вызывается правой кнопкой мыши

$showitem = TrayCreateItem("Показать")
TrayItemSetOnEvent($showitem,"_Show")

TrayCreateItem("")

$hideitem = TrayCreateItem("Скрыть")
TrayItemSetOnEvent($hideitem,"_Hide")

TrayCreateItem("")

$exititem = TrayCreateItem("Выход")
TrayItemSetOnEvent($exititem,"_Exit")

TraySetState()
TraySetToolTip("messeger - для входа в меню нажмите правой кнопкой")

$dummywindow = GUICreate("", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

GUISwitch($GOOEY)
GUISetState(@SW_SHOW)

GUICtrlSetData ($edit, "",1); вставить начальную строку в поле Edit
GUICtrlSetData ($input, "Status Online",1); вставить начальную строку в поле Edit чата
GUICtrlSetState ($otpravka, $GUI_DEFBUTTON); установка кнопки Отправить кнопкой по умолчанию

; Гуй в режиме сообщений
;==============================================
While 1
	$msg = GUIGetMsg() ; переводим гуй в режим опроса
	$readinput = GUICtrlRead($input) ; присваиваем содержимое поля ввода переменной
   ; Нажатие клавиши Очистить
   ;---------------------------------------
	If $msg = $ochistka Then ; назначаем событие на кнопку Очистить
	GUICtrlSetData($input, "")
	EndIf
   ; Нажатие клавиши Отправить файл
   ;---------------------------------------
   If $msg = $sendfile Then
	   $message = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
	   $var = FileOpenDialog($message, @WindowsDir & "\", "Рисунки (*.jpg;*.bmp)", 1 + 4 )
	   If @error Then
		   MsgBox(4096,"","Не выбрано ни одного файла")
	   Else
		   $var = StringReplace($var, "|", @CRLF)
		   MsgBox(4096,"","Вы выбрали " & $var)
	   EndIf
   EndIf
   ; закрыть гуй
   ;---------------------------------------
   If $msg = $GUI_EVENT_CLOSE Then ; назначаем событие на кнопку закрыть
	ToolTip("messenger by S1R1US[B.S.] - выходим...",0,0,"Завершение работы")
	Sleep(2000)
    ExitLoop
	EndIf
   ; свернуть гуй
   ;---------------------------------------
   If $msg = $GUI_EVENT_MINIMIZE Then ; назначаем кнопку свернуть кнопкой сворачивания в трей
	GUISetState(@SW_HIDE)
	EndIf
   ; Нажатие клавиши Отправить
   ;---------------------------------------
   If $msg = $otpravka Then
	$ret = TCPSend($socket, @ComputerName & " (" & @HOUR & ":" & @MIN & ":" & @SEC & ")" &": " & $readinput)
	If @ERROR Then
	WinSetTitle($GOOEY,"","Ошибка отправки")
	Sleep(2000)
	ExitLoop
	EndIf
	; Сервер отключен -> выход
    ;---------------------------------------
	If $recv = "~~rejected" Then
      _GUICtrlEdit_AppendText($edit, "~~Connection Rejected" & @CRLF)
      WinSetTitle($GOOEY,"","Connection Rejected")
      Sleep(2000)
      TCPSend( $socket, "~~сброшен")
      ExitLoop
  EndIf
    If $ret > 0 Then _GUICtrlEdit_AppendText($edit, @ComputerName & " (" & @HOUR & ":" & @MIN & ":" & @SEC & ")" &": " & $readinput & @CRLF)
   GUICtrlSetData($input, "")
    EndIf
   $recv = TCPRecv($socket, 8192)
   $err = @error
   If $recv = "~~bye" Then
    _GUICtrlEdit_AppendText($edit, "~~Connection Lost" & @CRLF)
    WinSetTitle($GOOEY,"","Соединение сброшено")
    Sleep(2000)
	ExitLoop
   EndIf
   If $err <> 0 Then ExitLoop
   ; Сервер отключен -> выход
   ;---------------------------------------
   If $err=0 AND $recv <> "" Then
	_GUICtrlEdit_AppendText($edit, ">" & $recv & @CRLF)
	SoundPlay(@WindowsDir & "\Media\chimes.wav",1)
	EndIf
WEnd

Func _Hide() ; функция сворачивания
	GUISetState(@SW_HIDE)
EndFunc

Func _Show() ; функция отображения скрытого окна
	GUISetState(@SW_SHOW)
	Sleep(300)
	GUISetState(@SW_RESTORE)
EndFunc

Func _Send()
    Switch @HotKeyPressed
        Case "{enter}"
            $True = WinActive($GOOEY)
            If $True = True Then
				$ret = TCPSend($socket, @ComputerName & " (" & @HOUR & ":" & @MIN & ":" & @SEC & ")" &": " & $readinput)
				GUICtrlSetData($input, "")
            Else
                Send("{Enter}")
            EndIf
    EndSwitch
EndFunc

Func _Exit()
    ToolTip("messenger by S1R1US[B.S.] - выходим...",0,0,"Завершение работы")
	Sleep(2000)
    Exit
EndFunc

Клавиша Enter теперь выполняет отправку, но перехватывает само нажатие, и если окно не активно то Enter больше нигде не работает. Высылка Send("{Enter}") не помогла, возможно нужно как то по другому...например через вкл/откл горячих клавиш, но я не знаю как это реализовать.
Жду Ваших идей!)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
S1R1US [?]
если окно не активно то Enter больше нигде не работает

Код:
Func _Send()
    Switch @HotKeyPressed
		Case "{ENTER}"
            If WinActive($GOOEY) Then
                $ret = TCPSend($socket, @ComputerName & " (" & @HOUR & ":" & @MIN & ":" & @SEC & ")" &": " & $readinput)
                GUICtrlSetData($input, "")
            Else
				HotKeySet("{ENTER}")
                Send("{ENTER}")
				HotKeySet('{ENTER}', '_Send')
            EndIf
    EndSwitch
EndFunc
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
madmasles
Огромное спасибо, я как раз после прочтения и дописал свой "хук" на клавишу Enter. Но вот выслать его после перехвата, как то не смог додуматься - как реализовать такой процесс...
CreatoR
Огромное Вам спасибо! Поразительно, как всё на самом деле было просто! Восхищён... :laugh::IL_AutoIt_1:

P. S. Заодно выявил ещё один "недочёт" в своей функции и устранил) ещё раз спасибо всем!
 
Верх