1

Тема: AutoHotkey: Определение наличия выделенной области

Я хочу в скриптах AutoHotkey определять есть ли в окне выделенная область, и в зависимости от этого назначать скрипту разные действия. Сейчас я для этого использую следующий код:

Clipboard = ;очистка буфера обмена
Send, ^{sc02E} ;CTRL+С
ClipWait, 0.9, 1
if ErrorLevel <> 0
{
;действие если нет выделения
return
}
;действие если есть выделение
return

Но ждать 1 сек. это долго, а если сделать время меньше, скрипт иногда срабатывает не правильно (копируется изображение).

Может есть другой способ, может как-то через проверку свойства Enabled строки «Копировать» меню окна (у кнопок я нашел как это проверить, а как у меню - нет), или есть какое-то свойство окна где можно определить есть выделение или нет.

2

Re: AutoHotkey: Определение наличия выделенной области

Насколько я правильно понимаю, единого решения (кроме предложенного тобой) этой задачи нет, так как даже для блокнота и ворда это будут уже два совершенно разных кода.
Уточни, где ты хочешь использовать скрипт.

3

Re: AutoHotkey: Определение наличия выделенной области

Скрипт работает в WinDjView.
Но наверное подойдет пример и для Блокнота.

4

Re: AutoHotkey: Определение наличия выделенной области

Правильно было бы спросить, в каком контроле находится эта выделенная область? Если в Edit — то наличие выделения можно определить с помощью сообщения EM_GETSEL:

   EM_GETSEL := 0xB0
   VarSetCapacity(Start, 8), VarSetCapacity(End, 8)
   
F11::
   WinGet, List, ControlList, A
   Loop, parse, List, `n
   {
      if InStr(A_LoopField, "Edit")
      {
         SendMessage, EM_GETSEL, &Start, &End, %A_LoopField%, A
         if (NumGet(Start) != NumGet(End))
            MsgBox, Есть выделение в контроле %A_LoopField%
      }
   }
   Return

Сообщение EM_GETSEL работает и в некоторых других контролах. Какие конкретно интересуют? Название контрола можно определить с помощью AU3_Spy.exe.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AutoHotkey: Определение наличия выделенной области

Там (в «WinDjView») такой интересный элемент управления: AfxFrameOrView80su - Поиск в Google.

6

Re: AutoHotkey: Определение наличия выделенной области

Да, там контрол AfxFrameOrView80su
Из этого http://msdn.microsoft.com/en-us/library … 85%29.aspx как я понимаю, ничего не подойдет.
Как все-таки меню «узнает» блокировать пункт «Копировать» или нет.

7

Re: AutoHotkey: Определение наличия выделенной области

Попробуй в моём коде вместо

if InStr(A_LoopField, "Edit")

написать

if InStr(A_LoopField, "AfxFrameOrView80su")

Может, сработает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AutoHotkey: Определение наличия выделенной области

В этом случаи всегда реагирует как если выделение есть, даже когда его нет.

9

Re: AutoHotkey: Определение наличия выделенной области

Fry, в «WinDjView» два типа выделения — для текстового слоя и для графического слоя. Вы оба пробовали?

Наверное, Вам придётся либо попробовать отловить сообщения самому, либо попробовать пообщаться с разработчиком «WinDjView» по вопросу сообщений.