1 (изменено: 1srafel, 2025-04-09 02:12:10)

Тема: AHK: Контекстное меню Gui Edit

Скрипт после запуска меняет контекстное меню для Edit, но при переключении окон и возвращении на окно Gui - возвращается контекстное меню по умолчанию. В чем причина?


Gui, +AlwaysOnTop +ToolWindow hwndMainWin -dpiscale
Gui, Color, F5F5F5
Gui, Font, S11, Tahoma
Gui, Add, Edit, Limit23 w250 vn hwndhEdit

obj := {h: hEdit}
obj.f := fn := Func("SetDots").Bind(obj)
GuiControl, +g, %hEdit%, % fn

Gui, Show,, 

Gosub, LOAD_MENUS  ;!!
Gosub, LOADHOTKEYS ;!!
Return


LOADHOTKEYS:
   hotkey, IfWinActive, ahk_id %MainWin%
   hotkey, RButton, RButton_Down 
RETURN
RButton_Down:
   KeyWait, RButton
   MouseGetPos,,,, hCtrl, 2
   If (hCtrl = HEdit)
      Menu, EditMenu, Show
Return
LOAD_MENUS:
   Menu, EditMenu, Add, Вырезать, ContextCut
   Menu, EditMenu, Add, Копировать, ContextCopy
   Menu, EditMenu, Add, Вставить, ContextPaste
   Menu, EditMenu, Add, Удалить, ContextDelete
   Menu, EditMenu, Add
   Menu, EditMenu, Add, Выделить всё, ContextSelectAll
Return
ContextCut:
   ControlSend, Edit1, ^{sc2D}, ahk_id %MainWin%
return
ContextCopy:
   ControlSend, Edit1, ^{sc2E}, ahk_id %MainWin%
return
ContextPaste:
   ControlSend, Edit1, ^{sc2F}, ahk_id %MainWin%
return
ContextDelete:
   ControlSend, Edit1, {sc153}, ahk_id %MainWin%
return
ContextSelectAll:
   ControlSend, Edit1, ^{sc1E}, ahk_id %MainWin%
return

GuiClose:
   ExitApp

ButtonCopy:
   Clipboard := RegExReplace(ok,"`n", " ")
Return

SetDots(obj)  {
   global
   GuiControl, -g, % obj.h
   GuiControlGet, num,, % obj.h
   num := StrReplace(num, " ")

   GuiControl,, % obj.h, % RegExReplace(num, "\d(?=(\d{3})+$)", "$0 ")
   Send {End}
   fn := obj.f
   GuiControl, +g, % obj.h, % fn
}
return

2 (изменено: __Михаил__, 2025-04-09 02:07:01)

Re: AHK: Контекстное меню Gui Edit

АХК так устроен - необходимо активацию окна сделать и лишь затем только перехват сработает.
Точнее сама HotKey привязка к окну.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

3 (изменено: __Михаил__, 2025-04-09 02:08:36)

Re: AHK: Контекстное меню Gui Edit

Для точного перехвата ПКМ можно сделать так:

OnMessage(0x204, "WM_RBUTTONDOWN")	; Регистрируем обработчик сообщений для ПКМ.
Return

; Обработчик нажатия правой кнопки мыши:
WM_RBUTTONDOWN(wParam, lParam, msg, hwnd){
 Global hEdit
 If (hwnd = hEdit){
  Menu, EditMenu, Show	; Показываем своё меню.
  ;Return 0		; Подавляем стандартное меню. --Не заметил эффекта--
 }
}
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101