Виправляємо Alt-Tab в LabView

Коли пишеш програму в середовищі LabView, в певний момент її стає занадто багато для того, щоб уміститися в один екран. «Правила хорошого тону» LabView говорять про те, що в таких випадках треба розбивати один vi файл на декілька subvi файлів. З часом таких subvi стає дуже багато. Однак про зручної навігації хлопці з NI якось не подбали.

Мало того, що LabView зрушує всі свої вікна на початок Alt-Tab списку (більше так не робить ніхто: <a href=«en.wikipedia.org/wiki/Alt-Tab>en.wikipedia.org/wiki/Alt-Tab), так ще, незважаючи на активно використовується можливість перевизначати іконки для vi файлів, у списку Alt-Tab замість них – стрункі ряди з логотипів LabView:

image

Деяких така поведінка спонукає до купівлі другого монітора. Для них значною мірою проблема цим не вирішується. Ще частково допомагає інтерфейс Windows Aero з його мініатюрами в меню Alt-Tab. Але начебто лежить на поверхні – (а) зробити перемикання таке ж, як у всіх інших додатках, і (б) виводити в списку іконки vi – стандартними засобами недосяжно.

Судячи з того, що почалося це чи не з самої першої версії, а відповідна «ідея щодо поліпшення припадає пилом на «форумі з обміну ідеями» з 2010 року forums.ni.com/t5/LabVIEW-Idea-Exchange/Make-Alt-Tab-behaviour-consistent-with-other-applications/idi-p/1162219, просити про це National Instruments марно. Однак дещо зробити все-таки можна.

Частина 1. Вийти з Labview за одне натискання

По-перше, я написав ось такий скрипт на python, за допомогою якого можна перемикатися між, наприклад, браузером і поточним вікном LV за одне натискання, скажімо, Alt-`:

import ctypes

EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
GetClassName = ctypes.windll.user32.GetClassNameW
SwitchToThisWindow = ctypes.windll.user32.SwitchToThisWindow

we_are_in_labview = None

def get_title(hwnd):
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
return buff.value

def get_cls(hwnd):
buff = ctypes.create_unicode_buffer(100)
GetClassName(hwnd, buff, 99)
return buff.value

def foreach_window(hwnd, lParam):
global we_are_in_labview

title, cls = get_title(hwnd), get_cls(hwnd)

if IsWindowVisible(hwnd):
title, cls = get_title(hwnd), get_cls(hwnd)

if (title, cls) in (('Start', 'Button'), (", 'Shell_TrayWnd')) or \
cls == 'TeamViewer_TitleBarButtonClass':
return True

if we_are_in_labview is None:
we_are_in_labview = cls.startswith('LV')
else:
if we_are_in_labview and cls.startswith('LV'):
return True

SwitchToThisWindow(hwnd, True)
return False
return True

EnumWindows(EnumWindowsProc(foreach_window), 0)

Взагалі, я паралельно писав на c і на python, тут наводжу версію python тому що так код трохи більше читається і його можна запустити без visual studio (потрібно лише встановлений python будь-якої версії: 2.x або 3.x).
Повісити запуск скрипта на поєднання клавіш можна і на python'е, але за допомогою autohotkey зробити це простіше:

#IfWinNotActive ahk_class PuTTY
!`::
Run, C:\alttab\switch.py,,Hide

(тут биндинг відключається в окремо взятій програмі putty)

Частина 2. Перейти до vi кліком на його іконку

По-друге, я допрацював відповідний quickqrop плагін Show Open VIs, щоб надати йому божеський вид і додав навігацію з клавіатури.

image
image


Порівняно з існуючими інструментами навігації Show Open VIs:
– краще Project Explorer тим, що показує тільки відкриті файли, а не всі файли в проекті, плюс не займає зайве місце на панелі завдань і в Alt-Tab списку (рис.зліва);
– краще вбудованого в LV менеджер вікон (Ctrl-Alt-W) наявністю іконок (рис.справа);
– краще системного Alt-Tab тим, що це саме іконки vi а не багаторазовий логотип NI.

Натискання на праву кнопку миші можна вибрати, куди необхідно перейти: Front Panel або на Block Diagram.

В оригіналі цей плагін виглядав дуже сирим і неакуратним. Всі один на одного налезало, а коли зменшуєш розмір вікна до розмірів, порівнянних із звичайним вікном alt-tab, взагалі переставав працювати.

Код плагіна я виклав на гітхабі. Перевіряв в LV 2011 і 2014, x32 і x64. Для установки треба скопіювати кілька файлів в каталог LabView в Program Files, перезапуск Labview не потрібно. Залежить від «OpenG File Library». Подробиці в readme.

Управління з клавіатури зробив таке: Ctrl-Space Ctrl-4 для запуску (щоб вже точно не було конфліктів з іншими плагінами), [Ctrl-] Tab або стрілка вправо наступний пункт, [Ctrl-] Shift-Tab або стрілка вліво – попередній, Enter або Space – перемикання, Esc – вихід.

Щоб не натискати цей зайвий Ctrl-Space (вхід в меню quickdrop), можна використовувати ось такий скрипт на autohotkey, щоб запуск відбувався, наприклад, Ctrl-`:

#IfWinActive ahk_class LVDChild
^`b::
Send ^{Space}
WinWait Quick Drop
Send ^4

Часовий проміжок між появою вікна quickdrop і його закриттям після отримання сполучення клавіш склав у мене близько 0.12 секунди. В принципі, це непогано, але очей встигає побачити «зайве» вікно. Тим, хто, як я, quickdrop крім як для запуску плагінів не використовує, може виявитися корисною ось така недокументированная опція в labview.ini:

QuickDropTransparency=100

Вона робить вікно QuickDrop невидимим (параметр означає, що на 100%) із збереженням всього функціоналу.

Як поєднати ці два поліпшення (відображення іконок vi і звичне поведінка alt-tab) я не придумав – всі вікна LabView знаходяться в одній групі вікон і програмно переміщаються всередині z-order послідовності точно так само, як і через GUI: тільки як одне ціле, тобто інформація про те, з якого роду було перемикання – зсередини LabView або зовні LabView – втрачається. Можна запам'ятовувати історію при натисканні alt-tab, але такий спосіб не універсальний, так як не відловлює перемикання за допомогою миші.

У підсумку

Встановивши описані скрипт і плагін, отримуємо такі можливості: натискаючи Alt-` дуже зручно перемикатися між, наприклад, браузером і якимось конкретним вікном в LabView, а по натисканні Ctrl-` можна бачити іконки відкритих vi файлів і перемикатися між ними або за допомогою миші або клавіатури.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.