1

Тема: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

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

Вопрос, как можно реализовать посылку нажатия переключения между областями по горячим клавишам с помощью SendMessage или PostMessage или каким то другим способом?

Во вложении на скрыншоте показано где в Notepad++ переключаться между областями.

Пробовал искать коды через Winspector, но ничего не нашел.

Post's attachments

notepad++.png 54.76 kb, 167 downloads since 2015-11-24 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

Если эти координаты можно как-то предсказать / рассчитать, то ControlClick. Если невозможно, тогда ImageSearch.

3

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

F8, нет?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

alt + [ - нажатие первой стрелочки.
alt + ] - нажатие второй стрелочки.

#if WinActive("ahk_exe notepad++.exe")
 !vkDB:: ; alt + [
 !vkDD:: ; alt + ]
 ControlGetPos,,,W, ,nsspliter1,A
 ControlGetPos,,, ,H,wespliter1,A
 WorH_ctrl := (H) ? "wespliter1" : (W) ? "nsspliter1" : ""
 BT1pos := "x1 y1" 
 BT2pos := "x" (W?W-2 : 1) " y" (H?H-2 : 1)
 Vlpos := ((A_ThisHotkey="!vkDB") ? BT1pos : BT2pos)
 ControlClick, % WorH_ctrl, A,,,, NA %Vlpos% D
 ControlClick, % WorH_ctrl, A,,,, NA %Vlpos% U
 return
#if

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

5

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

F8, нет?

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

Точно, по F8 переключение только фокуса, я это уже смотрел.

Странно что не реализовано более удобного способа переключения средствами самого Notepad++, ведь фокус можно навести и одним кликом, а вот полностью переключаться между областями было бы хорошо.

yalanne, скрипт работает отлично!

6

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

А можно ли реализовать данное переключение по одной горячей клавише?

7 (изменено: yalanne, 2015-11-25 13:31:18)

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

#if WinActive("ahk_exe notepad++.exe")
 f8::
 ControlGetPos,,,W, ,nsspliter1,A
 ControlGetPos,,, ,H,wespliter1,A
 WinGetTitle old_Title,A
 WorH_ctrl := (H) ? "wespliter1" : (W) ? "nsspliter1" : ""
 BT1pos := "x1 y1" 
 BT2pos := "x" (W?W-2 : 1) " y" (H?H-2 : 1)
 ControlGetFocus focus_ctrl,A
 sendInput {F8}
 Vlpos := (focus_ctrl = "Scintilla1") ? BT2pos : (focus_ctrl = "Scintilla2") ? BT1pos : ""
 ControlClick, % WorH_ctrl, A,,,, NA %Vlpos% D
 ControlClick, % WorH_ctrl, A,,,, NA %Vlpos% U
 keywait % A_ThisHotkey 
 return
#if

По идее когда активна первая группа(когда контрол находится с лева или в верху) у контрола Scintilla индекс 1, А со 2м индексом вторая группа(с права или в низу). Но иногда почему то скрипт видит наоборот у первой индекс 2, у второй индекс 1. Из за этого может быть холостое нажатие, после последующие нажатия переключения нормальное, но без фокуса.

8

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

У меня первое нажатие всегда холостое, выводит текущую область из фокуса, а все последующие нажатия переключают нормально, но без фокуса на переключающуюся область.

9

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

11ю строку тогда замени

 Vlpos := (focus_ctrl = "Scintilla2") ? BT2pos : (focus_ctrl = "Scintilla1") ? BT1pos : ""

10

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

yalanne, в таком случае срабатывает только со второго раза на переключение в правую область, а дальше меняет только фокусы областей при нажатии F8

11

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

Тоже иногда Notepad++ пользуюсь, у меня так вышло:

#IfWinActive ahk_class Notepad++
$F8:: WinExist("ahk_class Notepad++"), SwitchAreaInNotepad()
#If

SwitchAreaInNotepad()
{
   WinGet, ControlList, ControlList
   if !(pref := WeOrNs(ControlList))
      Return
   
   pos := GetSpliterPos(ControlList, pref)
   ControlGetPos, X, Y, W, H, %pref%spliter1
   if (pos = "D")
      x_click := X + 3, y_click := Y + H - 3
   if (pos = "R")
      x_click := X + W - 3, y_click := Y + 3
   if (pos = "U")
      x_click := X + 3, y_click := Y + 3
   if (pos = "L")
      x_click := X + 3, y_click := Y + H - 3
   
   ControlClick, X%x_click% Y%y_click%
   ControlFocus, % GetCurrentScintilla(ControlList, pref)
}

WeOrNs(List)
{
   for k, spliter in ["nsspliter1", "wespliter1"]  {
      if InStr(List, spliter)  {
         ControlGet, vis, Visible,, % spliter
         if vis
            Return SubStr(spliter, 1, 2)
      }
   }
}

GetSpliterPos(List, pref)
{
   Scintilla := GetCurrentScintilla(List, pref)
   if (pref = "we")
      coord1 := "X", coord2 := "W"
   else
      coord1 := "Y", coord2 := "H"
   
   ControlGetPos, X, Y, W, H, %pref%spliter1
   center := %coord1% + %coord2%//2
   ControlGetPos, X, Y, W, H, % Scintilla
   
   if (Abs(%coord1% - center) < Abs(%coord1% + %coord2% - center))
      Return (pref = "we") ? "D" : "R"
   else
      Return (pref = "we") ? "U" : "L"
}

GetCurrentScintilla(List, pref)
{
   coord := pref = "we" ? "W" : "H"
   CurrentScintilla := Scintilla1, CoordPrev := 0
   Loop, parse, List, `n
   {
      if InStr(A_LoopField, "Scintilla")  {
         ControlGet, vis, Visible,, % A_LoopField
         if vis  {
            ControlGetPos,,, W, H, % A_LoopField
            if (%coord% > CoordPrev)
               CoordPrev := %coord%, CurrentScintilla := A_LoopField
         }
      }
   }
   Return CurrentScintilla
}

Нужно учитывать, что Scintilla может быть не только с индексами 1 или 2, но и больше.

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

12

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

teadrinker, переключает

13

Re: AHK: Нажатие по элементам Notepad++ с помощью SendMessage/PostMessage

Если кому интересно, вот с помощью этого плагина можно добавить свою кнопку в панель инструментов Notepad++ для переключения между областями по нажатию на кнопку.

1. Устанавливаем плагин Customize Toolbar
2. Включаем опцию Customize Toolbar --> Custom Buttons --> Перезапускаем Notepad++
3. Добавляем название команды запуска и горячую клавишу на запуск скрипта в Меню --> Запуск --> Запуск... или по нажатию F5
4. Прописываем в файле такие параметры: D:\Program Files\Notepad++\plugins\Config\CustomizeToolbar.btn
Запуск,НазваниеКомандыЗапуска,,,ButtonIcon.bmp
Указываем кодировку для файла CustomizeToolbar.btn инструкция здесь.