Что нового

[Мышь, клавиатура] Дополнительные горячие кнопки в сторонних приложениях. Как?

EqKeeper

Новичок
Сообщения
29
Репутация
1
Доброго времени суток!

Подскажите, как решить следующую задачу: внедрить или переназначить в совершенно стороннем приложении горячие кнопки? Для примера возьмем тот же Explorer, который со времен Vista переставил "переход на уровень выше" с Backspace на Alt+Up. Нарисовал такой вот скриптик:
Код:
HotKeySet("{Backspace}", "ToUp")

While 1
	Sleep(65535)
WEnd

Func ToUp()
	HotKeySet("{Backspace}")
	$win = WinGetHandle("")
	if (StringInStr(WinGetClassList($win), "ClassicShell.UpButton") <> 0) Then
		Send("!{Up}")
	EndIf
	HotKeySet("{Backspace}", "ToUp")
EndFunc

Добавлю, что на машине (Win7) установлен ClassicShell и ClassicShell.UpButton - его кусок. Впрочем, он здесь используется лишь для того, чтобы удостовериться, что окошко эксплорера, что можно узнать и иным способом.

Все здорово, но есть одно но - скрипт перехватывает все нажатия на Backspace! Что, мягко говоря, приносит больше вреда, чем пользы.

Конечно, можно использовать другое, редкое сочетание. Например - Alt+Backspace. Но это уже не то. Вот и интересует - можно ли средствами AutoIt реализовать полноценную замену кнопок или для этого лучше поискать другие средства?

Или в данном конкретном случае придется извращаться, каким-нибудь образом отлавливая, что в данный момент не происходит редактирование имени файла, изменение поля адреса или строки поиска, и только после этого отсылать Alt+Up, а в противном случае - Backspace?
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
1. Для кода AutoIt есть соответсвующий тег. В редакторе - черненькая кнопочка с логотипом AutoIt.
2. Например так:
Код:
#include <WinAPIEx.au3>

Opt('GUIOnEventMode', 		1)
Opt('MustDeclareVars', 		1)

Global	$iCheckTime, $fCheckSt
		$iCheckTime = 100; ms

;~ Таймер на проверку активного окна каждые $iCheckTime мсек.
AdlibRegister('_Check', $iCheckTime)

;~ Основной цикл скрипта - бесконечный. Что бы скрипта не закрывался.
While 1
    Sleep(10)
WEnd

;~ Функция проверкаи активного окна.
;~ Если процесс активного окна равен: explorer.exe, то выполняется переназначение клавиши Backspace.
Func _Check()
;~ 	WinGetHandle('[ACTIVE]') - получение указателя на активное окно
;~ 	WinGetProcess(WinGetHandle('[ACTIVE]') - получение PID процесса по указателю окна
;~ 	_WinAPI_GetProcessFileName - получение полного пути файла по PID процесса
	If StringRegExpReplace(_WinAPI_GetProcessFileName(WinGetProcess(WinGetHandle('[ACTIVE]'))), '^.+\\(.+)$', '\1') == 'explorer.exe' Then
		If Not $fCheckSt Then
			$fCheckSt = 1
			HotKeySet('{Backspace}', '_HotKey')
		Else
			$fCheckSt = 0
			HotKeySet('{Backspace}')
		EndIf
	EndIf
EndFunc

Func _HotKey()
	Send('!{Up}')
EndFunc


WinAPIEx
 
Автор
E

EqKeeper

Новичок
Сообщения
29
Репутация
1
Учтено. :smile:
Большое спасибо, сейчас разберусь...

---

Нет, к сожалению это немного не то. С активностью окна я разобрался. Проблема в том, что в этом самом окне она будет всегда ее перехватывать. В том числе, когда я переименовываю файл, стираю адрес и т.д.
 
Верх