Довольно долго я пытался бороться с этой проблемой и вот что получилось. Предлагаю вариант своего решения. Сразу предупреждаю, что с такими самолетами, как ПТ Ту-154, этот прибор бесполезен.
Прибор работает как в FS9, так и в FSX. Сам он невидимый. Прописывается в файле panel.cfg в главной панели или 1 секции VC следующим образом:
gaugeXX=V_B.DXService!JoyToXMLVars, 0,0,10,10 Где XX — номер прибора в панели.
Разумеется, сам файл V_B.DXService.gau должен находиться в папке Gauges.
Логика работы прибора довольно проста, посредством функций DirectInput ищуться имеющиеся в системе джойстики (до 4), а затем, постоянно считывается состояние осей, кнопок и хаток этих четырех джойстиков. Посредством механизма _named_variable состояние органов управления джойстиков передаются в XML-переменные. И если эти XML-переменные присутствуют в XML-приборах или коде анимации визуальной модели, они соответствующим образом изменяються. Внимание, все переменные начинаються с нуля, проэтому переменные первого джойстика в системе будет начинаться с J0, второго с J1 и т.д. Нумерация кнопок также начинается с нуля, первая кнопка юудет _000, вторая _001.
Вот описание переменных. Все описания приведены для первого джойстика в системе, другие будут отличаться только числом после символа J.
Оси:
(L:J0AxisX, Number) — ось X
(L:J0AxisY, Number) — ось Y
(L:J0AxisZ, Number) — ось Z
(L:J0AxisRx, Number) — Вращение вокруг оси X
L:J0AxisRy, Number) — Вращение вокруг оси Y
L:J0AxisRz, Number) — Вращение вокруг оси Y
Движки:
(L:J0Slider_0, Number) — движок 0 (первый)
(L:J0Slider_1, Number) — движок 1 (второй)
Я сознательно не оптимизировал показания осей, передаеться то, что считывается из джойстика. Это уже на совести разработчика прибора алгоритм преобразования значения оси в свою переменную.
Хатки: Всего DirectX работает с 4 хатками в джойстике.
(L:J0Hat_0, Enum) — хатка 0 (первая)
(L:J0Hat_1, Enum) — хатка 1 (вторая)
(L:J0Hat_2, Enum) — хатка 2 (третья)
(L:J0Hat_3, Enum) — хатка 3 (четвертая)
Переменная каждой хатки может принимать 9 фиксированных значений: -1 центр, 0 вперед, 4500 вперед/вправо, 9000 вправо, 13500 вправо/назад, 18000 назад, 22500 назад/влево, 27000 влево, 31500 влево/вперед.
Кнопки: Можно работать со 128 кнопками, переменная кнопки принимает значение 1 если нажата 0, если отпущена.
(L:J0Button_000, number) …. (L:J0Button_127, number) от первой до 128 кнопки.
DirectInput также позволяет измерять скорость, ускорение и усилие на оси, но пока я еше сам не придумал, как это можно использовать, поэтому в приборе не реализовал.

Тогда возможно использование в 2 вариантах. Полетал на дефолтнике, выбрал «свой» самолет, отключил джой Ctrl K и все уже «настроено». Причем, сколько «своих» самолетов, столько и вариантов настрйки джойстиков.
Например имеем прибор на ХМЛе «тумблер радиовысотомера»
<Gauge Name=»Radio Alt switch» Version=»1.0″>
<Element>
<Select>
<Value>(L:Radio alt switch,bool)</Value>
<Case Value=»0″>
<Image ImageSizes=»17,100″ Name=»ver_down.bmp»/>
</Case>
<Case Value=»1″>
<Image ImageSizes=»17,100″ Name=»ver_up.bmp»/>
</Case>
</Select>
</Element>
<Mouse>
<Cursor Type=»Hand»/>
<Click>(L:Radio alt switch,bool) ! (>L:Radio alt switch,bool)</Click>
<Tooltip ID=»»>Radio altitude ind switch</Tooltip>
</Mouse>
</Gauge>
Например имеем прибор на ХМЛе «тумблер радиовысотомера»
<Gauge Name=»Radio Alt switch» Version=»1.0″>
<Element>
<Select>
<Value>(L:Radio alt switch,bool)</Value>
<Case Value=»0″>
<Image ImageSizes=»17,100″ Name=»ver_down.bmp»/>
</Case>
<Case Value=»1″>
<Image ImageSizes=»17,100″ Name=»ver_up.bmp»/>
</Case>
</Select>
</Element>
<Mouse>
<Cursor Type=»Hand»/>
<Click>(L:Radio alt switch,bool) ! (>L:Radio alt switch,bool)</Click>
<Tooltip ID=»»>Radio altitude ind switch</Tooltip>
</Mouse>
</Gauge>
Ответил на ProTu форуме, в ветке «Новые горизонты Mjoy», но тут тоже продублирую:
Я для каждого самолета делаю свой XML-прибор, что-бы не изменять оригинал, а переменные все равно будут доступны. В этом приборе у меня прописаны все функции для обмена между кнопками и осями джойстика и XML-переменными. В Вашем случае переменная (L:Radio alt switch,bool) — вроде выключатель радиовысотомера, при щелчке мыши просто инвертируется, в зависимости от ее значения меняеться битмап виртуального тумблера. Для связи с «железным» тумблером прибор будет выглядеть примерно так:
<Size X=»3″ Y=»3″/>
<Element>
<Select>
<Value>
(L:J0Button_000, number) 1== if{
1 (>L:Radio alt switch,bool)
} els{
0 (>L:Radio alt switch,bool)
}
</Value>
</Select>
</Element>
</Gauge>
Здесь считываеться положение кнопки и однозначно устанавливается значение переменной. В любом случае положение тумблера железного и виртуального будут синхронизированы. Конечно, в таком простом случае можно просто присваивать значение переменной кнопки значению вашей переменной типа так:
,
но при усложнении логики это может не сработать, поэтому все-же лучше первый вариант.
А вообще, прежде всего смотрите в приборе раздел мышинных функций, как раз, там и видео, что происходит с переменной и как она должна зависить от положения «железного» тумблера.