Как установить фокус (keyboard focus) в окно FAR?

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Как установить фокус (keyboard focus) в окно FAR?

Post by DV »

Рассмотрим такой сценарий:
1. Из макроса вызывается win.ShellExecute() для запуска внешней программы, что передаёт фокус ввода этой программе.
2. Возможно ли после этого из макроса вызвать такой метод, чтобы фокус ввода вернулся обратно в FAR? (Т.е. окно FAR должно стать активным окном и получить фокус ввода).

Примечание:
Я знаю про возможность запустить внешнюю программу с флагом SW_HIDE или SW_SHOWNOACTIVATE. Однако, в этом случае мы сталкиваемся с особенностью работы ConEmu (при запуске FAR из-под ConEmu) : при выполнении, например,

Code: Select all

lua: win.ShellExecute(nil, nul, "notepad", nil, nil, 6)
фокус ввода не возвращается в FAR ( см. https://github.com/Maximus5/ConEmu/issues/2029 ).
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как установить фокус (keyboard focus) в окно FAR?

Post by citRiks »

все возможно, и довольно элементарно.
наиболее элементарно и поэтому даже скучно, если привлечь nircmd.
для продвинутых пользователей - нативные функции управления окнами из ЛуаДжит ФФИ
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Как установить фокус (keyboard focus) в окно FAR?

Post by DV »

citRiks wrote: Thu 15 Oct, 2020 12:14для продвинутых пользователей - нативные функции управления окнами из ЛуаДжит ФФИ
Я не уверен, что для получения HWND консольного окна FAR смогу написать на Lua что-то такое:
https://stackoverflow.com/questions/188 ... process-id
Конкретнее, меня там смущает вызов функции EnumWindows с передачей ему callback-функции и её параметра.
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Как установить фокус (keyboard focus) в окно FAR?

Post by Yegor »

ACTL_GETFARHWND + SetActiveWindow() ?
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как установить фокус (keyboard focus) в окно FAR?

Post by citRiks »

DV, Все это побеждается в итоге.
Еще есть DLL-ки для Луа, которые многое могут.
Модуль WinApi например
Если повезет - быстро справишься,
если не повезет - не быстро, но справишься
Если нужен легкий быстрый гарантированные результат, то все же nircmd лучшее
FFI это прикольно, но не нужно если не тянет к приключениям, а нужен просто результат
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Как установить фокус (keyboard focus) в окно FAR?

Post by DV »

Что-то мой скрипт не работает. Наверное, я не вижу (или не понимаю) чего-то очевидного...
Привожу полный текст проверочного скрипта:

Code: Select all

local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
  HWND SetActiveWindow(HWND hWnd);
  BOOL SetForegroundWindow(HWND hWnd);
  HWND GetParent(HWND hWnd);
]]

local function InvokeNotepad()
  local farWnd = far.AdvControl(far.Flags.ACTL_GETFARHWND)
  local parentWnd = C.GetParent(farWnd)
  --far.Message(farWnd, 'farWnd')
  --far.Message(parentWnd, 'parentWnd')
  win.ShellExecute(nil, nil, "notepad", nil, nil, 6)
  local result = C.SetActiveWindow(farWnd)
  --far.Message(result, 'result')
end

Macro {
  area = "Shell";
  key = "CtrlShiftF7";
  action = function() InvokeNotepad() end;
}
Что мне ещё непонятно - почему возвращаемое значение parentWnd (если раскомментировать строку far.Message(parentWnd, 'parentWnd')) равно NULL?

Примечание:
Напоминаю, что я запускаю FAR под ConEmu. Версия ConEmu не принципиальна (использовал разные версии за этот год).
Last edited by DV on Fri 16 Oct, 2020 14:36, edited 2 times in total.
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Как установить фокус (keyboard focus) в окно FAR?

Post by Yegor »

Похоже я был не прав:
SetActiveWindow function (winuser.h)

Activates a window. The window must be attached to the calling thread's message queue.
Но с SetForegroundWindow работает.

Но возможно у вас notepad будет запускаться позже чем вызываться SetForegroundWindow().
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как установить фокус (keyboard focus) в окно FAR?

Post by citRiks »

Если и когда зайдете в тупик, скажите мне, я в этом довольно профи, разберемся.
сейчас просто не вижу смысла копать конкретнее, пока не отрапортовали что с NirCmd не получается
Post Reply

Return to “Нужна помощь”