Заинтересовал вопрос можно ли перехватить нажатие клавиши ENTER в нужном мне окне, и вызвать функцию, а если окно неактивно - не выполнять такой перехват. Написал такой скрипт:
Клавиша Enter теперь выполняет отправку, но перехватывает само нажатие, и если окно не активно то Enter больше нигде не работает. Высылка Send("{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}") не помогла, возможно нужно как то по другому...например через вкл/откл горячих клавиш, но я не знаю как это реализовать.
Жду Ваших идей!)