| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C# Горячие клавиши для вызова команды (Только программно)

C# Горячие клавиши для вызова команды (Только программно)

Ответ
Поиск в этой теме
Непрочитано 13.02.2013, 12:07 #1
C# Горячие клавиши для вызова команды (Только программно)
Modis
 
Липецк, Москва
Регистрация: 12.06.2010
Сообщений: 534

Всем привет.
Заинтересовала меня тут одна тема, но информации не нашел.
Итак: допустим есть какая-то функция (например "MpHello"), есть окно автокада. Есть-ли возможность в окне автокада "перехватить" сочетание клавиш (например "Alt+M") и вызвать эту функцию?
Только без использования файла АПИ. Только программными методами.
Понимаю, что малой кровью не обойтись и нужно скорее всего использовать хуки, но я такого не умею
Может кто-нибудь обдумывал этот вопрос? Или есть у кого-нибудь готовый пример? Буду признателен.
Просмотров: 7959
 
Непрочитано 14.02.2013, 21:12
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Зачем тебе это? Имхо - переопределять "родные" горячие клавиши - плохая идея.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 14.02.2013, 23:24
#3
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Modis
Есть AutoIT который может сделать чаго захочешь...
Ресурс 1 и Ресурс 2
Есть вариант по проще это AutoHotkey
Вот тута примеры для автокада
Пример 1 и Пример 2
И нафиг не нужен и как Си шарп....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Автор темы   Непрочитано 15.02.2013, 01:15
#4
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Цитата:
Сообщение от hwd Посмотреть сообщение
Зачем тебе это? Имхо - переопределять "родные" горячие клавиши - плохая идея.
Я не хочу переопределять родные Я хочу использовать неопределенную горячую клавишу для запуска одной функции

DEM, спасибо за ссылки, но мне в данном случае не нужны готовые сторонние продукты

И вообще - странно, что такая вещь оказывается столь проблематичной...
Modis вне форума  
 
Непрочитано 15.02.2013, 07:36
#5
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Modis
НУ дык тогда используй AutoIT...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 15.02.2013, 11:28
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


2 Modis
Малой кровью в данном случае не обойтись. Проблема в том, чтобы по хэндлу получить объект, упакованный в управляемую оболочку.
Код:
[Выделить все]
CadWin.Window mainWin = cad.MainWindow;

// WinForms - это всего лишь управляемая обёртка над частью WinAPI, отвечающей за графику
// Попытка получить элемент управления по его хэндлу (упаковав результат в управляемую обёртку)
System.Windows.Forms.Control _control = System.Windows.Forms.Control.FromHandle(mainWin.Handle);
IntPtr ptr = Process.GetCurrentProcess().MainWindowHandle;
В данном примере ptr и mainWin.Handle имеют одно и то же значение (проверял на всякий случай), но _control получает значение null. Порывшись в инете нашёл такой топик. Там внимательно почитай ответ на вопрос. Т.е. без танцев с бубнами в данной ситуации не обойтись. Обозначенные в ответе библиотеки я не смотрел, может ты и сможешь с их помощью получить управляемую оболочку для _control (в этом случае приводишь его к типу Form и работаешь как обычно).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 15.02.2013, 12:07
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


В моем представлении Автокад использует WPF окно - которое не является оберткой над WinApi (тех Api которые "оборачивают" Windows.Forms) - соответственно попытка получить Forms контрол по дескриптору WPF окна ничего не даст - его (контролла) просто нет.
p.s. а даже если и использовали-бы - не факт что FromHandle обязан создавать Form контрол - он может (скорее всего) ищет только из уже созданных через Windows.Forms.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 15.02.2013 в 12:13.
Дима_ на форуме  
 
Непрочитано 15.02.2013, 12:10
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,411
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
В моем представлении Автокад использует WPF окно
И на чем же зиждется это представление?

А автору следует изучать Windows Hooks: http://support.microsoft.com/kb/318804/en-us и http://msdn.microsoft.com/en-us/magazine/cc188966.aspx
Это достаточно просто.

Последний раз редактировалось Александр Ривилис, 15.02.2013 в 12:18.
Александр Ривилис вне форума  
 
Непрочитано 15.02.2013, 12:16
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
В моем представлении Автокад использует WPF окно - которое не является оберткой над WinApi (тех Api которые "оборачивают" Windows.Forms) - соответственно попытка получить Forms контрол по дескриптору WPF окна ничего не даст - его (контролла) просто нет.
p.s. а даже если и использовали-бы - не факт что FromHandle обязан создавать Form контрол - он может (скорее всего) ищет только из уже созданных через Windows.Forms.
Не использует. В ObjectARX Documentation класс окна определён следующим образом:
Код:
[Выделить все]
public class Window : DisposableWrapper, IWin32Window;
Далее...
Цитата:
p.s. а даже если и использовали-бы - не факт что FromHandle обязан создавать Form контрол - он может (скорее всего) ищет только из уже созданных через Windows.Forms.
Внимательней почитай ответ по указанной мною выше ссылке - там пишут в чём причина.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 15.02.2013, 12:29
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от hwd Посмотреть сообщение
Внимательней почитай ответ по указанной мною выше ссылке - там пишут в чём причина.
Offtop: Да заинтересовало
Цитата:
The problem is that Control.FromHandle works only for the current process...
а разве Net плагины работают не из этого-же процесса?
з.ы. что-то меня память подводит я не помню откуда, но про WPF я точно не придумал (хоть с документацией и не поспоришь ).

Цитата:
public class Window : DisposableWrapper, IWin32Window;
Ребята нашел - по моему Вы не правы - это не System.Windows.Forms.IWin32Window - это System.Windows.Interop.IWin32Window - то есть WPF чистой воды.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 87
Размер:	39.7 Кб
ID:	96837  
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 15.02.2013 в 12:39.
Дима_ на форуме  
 
Непрочитано 15.02.2013, 13:16
#11
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


ВЫЛЫСЫПЫДЫСТЫ....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 15.02.2013, 13:35
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


2 Дима_
Весьма интересная информация... А какая версия AutoCAD у тебя? Я пробую на 2009-м, у меня совершенно другой результат:



Как видишь, для AutoCAD 2009 используется именно System.Windows.Forms.IWin32Window. Любопытно, начиная с какой версии они перекроили главное окно на WPF... Не могу проверить, т.к. под рукой только 2009 и 2013.

Если твой вариант подходит под все версии AutoCAD, для которых пишет Modis, то он в дамках... Это получается, что начиная с той версии AutoCAD, в которой главное окно на WPF, можно в обход имеющемуся .NET API крутить этим окном как угодно, модифицируя графический интерфейс как фантазия позволит.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 1305
Размер:	11.9 Кб
ID:	96849  
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 15.02.2013 в 13:42.
hwd вне форума  
 
Непрочитано 15.02.2013, 13:54
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Там же в первой строке видно откуда импорт - autocad 2010
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ на форуме  
 
Непрочитано 15.02.2013, 14:05
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,411
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Ребята нашел - по моему Вы не правы - это не System.Windows.Forms.IWin32Window - это System.Windows.Interop.IWin32Window - то есть WPF чистой воды.
А может это просто обертка для обычного Win32 окна, чтобы его использовать в WPF?
Александр Ривилис вне форума  
 
Непрочитано 15.02.2013, 14:16
#15
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Там же в первой строке видно откуда импорт - autocad 2010
Не обратил внимание
Цитата:
А может это просто обертка для обычного Win32 окна, чтобы его использовать в WPF?
Похоже на то... Я не смог по хэндлу получить экземпляр Form и для 2013-го (так же null).

Не пойму, для чего Майкрософт создала два совершенно одинаковых интерфейса в разных нэймспейсах... Какой в этом смысл? Можно было и одним ограничиться:
System.Windows.Forms.IWin32Window
System.Windows.Interop.IWin32Window
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C# Горячие клавиши для вызова команды (Только программно)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Горячие клавиши. Где "хранятся"? Artiznov AutoCAD 40 22.02.2024 11:23
Объединение разбитого на слова текста Mist AutoCAD 46 24.05.2020 21:08
Как программно подождать завершения команды DonVik Программирование 7 05.12.2008 15:23
Прозрачные команды Vova AutoCAD 17 21.06.2006 05:33
Горячие клавиши в ACAD 2006 Saret AutoCAD 4 12.07.2005 22:20