sproxy
Full Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору отключение / включение win клавиши: Код: #region: - Option Opt('GUIOnEventMode', 1) Opt('MustDeclareVars', 1) Opt('TrayIconDebug', 1) Opt('TrayIconHide', 0) #endregion #region: - Include #include <GuiButton.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <ToolTip_UDF.au3> #include <WindowsConstants.au3> #endregion HotKeySet('{ESC}', '_Pro_Exit') #region: - Global Global $hWinMain, $hState, $hOffOn Global $iWidth = 125 Global $sKey = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout' Global $sValueName = 'Scancode Map' Global $sValue = '00 00 00 00 00 00 00 00 03 00 00 00 00 00 5B E0 00 00 5C E0 00 00 00 00' Global $sState = RegRead($sKey, $sValueName) #endregion #region: - GUI $hWinMain = GUICreate('Off / On Win', $iWidth, 155, -1, -1, $WS_CAPTION+$WS_SYSMENU) GUISetIcon('shell32.dll', -40, $hWinMain) GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit') GUICtrlCreateGroup(' Клавиши Win: ', 5, 5, $iWidth-10, 50) GUICtrlSetFont(-1, 9, 400) $hState = GUICtrlCreateLabel('Включенна', 10, 26, $iWidth-20, 20, $SS_CENTER) GUICtrlSetFont(-1, 11, 700) $hOffOn = GUICtrlCreateButton('Выключить', 5, 60, $iWidth-10, 30, $BS_DEFPUSHBUTTON ) GUICtrlSetFont(-1, 8.5, 700) _ToolTip_SetText($hOffOn, 'Изминения вступять в силу' & @CRLF & 'после перезагрузки компьютер', 'Внимание:', 7) _ToolTip_SetBkColor($hOffOn, 0xffffff) _ToolTip_SetTextColor($hOffOn, 0x000000) _ToolTip_SetFont($hOffOn, 10, 400, 0, "MS Sans Serif") GUICtrlSetOnEvent(-1, '_Off_On') GUICtrlCreateButton('Перезагрузить', 5, 60+30, $iWidth-10, 30) GUICtrlSetOnEvent(-1, '_Restart') GUICtrlCreateButton('Закрыть [Esc]', 5, 60+30*2, $iWidth-10, 30) GUICtrlSetOnEvent(-1, '_Pro_Exit') #endregion #region: - После создания всех GUI _ToolTip_SetShowTime(86400000) _Set_State() GUISetState(@SW_SHOW, $hWinMain) #endregion #region: - Sleep, Exit While 1 Sleep(10) WEnd Func _Pro_Exit() Exit EndFunc #endregion Func _Set_State() If $sState <> '' Then GUICtrlSetData($hState, 'Выключенна') GUICtrlSetColor($hState, 0xff0000) GUICtrlSetData($hOffOn, 'Включить') Else GUICtrlSetData($hState, 'Включенна') GUICtrlSetColor($hState, 0x00bb00) GUICtrlSetData($hOffOn, 'Выключить') EndIf EndFunc Func _Off_On() If $sState <> '' Then RegDelete($sKey, $sValueName) Else RegWrite($sKey, $sValueName, 'REG_BINARY', $sValue) EndIf $sState = RegRead($sKey, $sValueName) _Set_State() EndFunc Func _Restart() Run('shutdown -r') ;~ Run('shutdown -r -t 60') _Pro_Exit() EndFunc | >>> ToolTip_UDF.au3 Добавлено: tayron 02:34 28-03-2009 Цитата: Самый большой косяк в том, что постоянно вылазает меню "пуск"! Ну а вообще, как я и говорил - секунду или около того приходится ждать, может от "большого" кода, нет? | как он вообще, этот скрипт, у Вас работал? там есть ошибки: Код: Func chengeWinLang() $hW = WinGetHandle("last") | В данном случае "last" будет воспринято как заголовок окна. может так имелось в виду: Код: $hWnd = WinGetHandle('[Active]') | Код: if $lang == 'en' then _SetKeyboardLayout("00000409",WinGetHandle($hWnd)); EndIf | нет смысла получать еще раз указатьель окна, он же был передан в функцию, просто оставить: Код: If $iLangCode == 'ru' Then _SetKeyboardLayout('00000419', $hWnd) | Код: Switch Case "00000409" return "en" Case "00000419" return "ru" EndSwitch | тут явно не хватает: $langCode, вот так: Код: Switch $langCode Case "00000409" return "en" Case "00000419" return "ru" EndSwitch | вот причесал: Код: #region: - Option Opt('MustDeclareVars', 1) Opt('TrayIconDebug', 1) Opt('TrayIconHide', 0) Opt('WinTitleMatchMode', 2) #endregion HotKeySet('{ESC}', '_Pro_Exit') HotKeySet('{LWIN}{SPACE}', '_ChengeWinLang') HotKeySet('{RWIN}{SPACE}', '_ChengeWinLang') HotKeySet('+{SPACE}', '_ChengeWinLang') #region: - Sleep, Exit While 1 Sleep(10) WEnd Func _Pro_Exit() Exit EndFunc #endregion Func _ChengeWinLang() Local $hWnd $hWnd = WinGetHandle('[Active]') Switch _GetKeyboardLayout($hWnd) Case 'ru' _ChLang('en', $hWnd) Case 'en' _ChLang('ru', $hWnd) EndSwitch EndFunc Func _GetKeyboardLayout($hWnd) Local $iLangCode Local $aRet = DllCall('user32.dll', 'long', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0) $aRet = DllCall('user32.dll', 'long', 'GetKeyboardLayout', 'long', $aRet[0]) $iLangCode = Hex($aRet[0], 4) Switch $iLangCode Case '0409' return 'en' Case '0419' return 'ru' EndSwitch EndFunc Func _ChLang($iLangCode, $hWnd) If $iLangCode == 'ru' Then _SetKeyboardLayout('00000419', $hWnd) If $iLangCode == 'en' Then _SetKeyboardLayout('00000409', $hWnd) EndFunc Func _SetKeyboardLayout($sLayoutID, $hWnd) Local $WM_INPUTLANGCHANGEREQUEST = 0x50 Local $ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', $sLayoutID, 'int', 0) DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, _ 'int', $WM_INPUTLANGCHANGEREQUEST, _ 'int', 1, _ 'int', $ret[0]) EndFunc | Цитата: может от "большого" кода, нет? | код оооочень не большой и обработка ооочень ростая. Все должно летать. На моей локальной Win XP по Shift+space обрабатывается мнгновенно. Скорее всего траблы из за виртуальныйо Windows. Цитата: ASC всеравно ее читает как клавишу | уммм, ASC, а кто это/что? _)) Цитата: Еще я обнаружил, что пробел в окно не отсылается | Как и писал выше. Здесь используется HotKeySet - он полностью заменяет действие клавиши. Но возможно сделать просто проверку на нажатие - но смысл? Что бы потом удалять пробелы? ...хм...хотя можно же их и автоматом удалить... Добавлено: хотя если высылать в окно BackSpace - то будут траблы, некоторые программы принимают BackSpace как вохврат на предыдущую страницу/окно.... |