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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как отследить события нажатие кнопок мыши ? (dll VB6)

Как отследить события нажатие кнопок мыши ? (dll VB6)

Ответ
Поиск в этой теме
Непрочитано 02.06.2016, 17:54 #1
Как отследить события нажатие кнопок мыши ? (dll VB6)
Erbol2014
 
ТОО
 
Аршалы
Регистрация: 22.05.2014
Сообщений: 52

Хочу в своей библиотеке получить сообщение когда пользователь щелкает команду, но не срабатывает.
Создаю свою dll в VB6, создаю класс, в нем пишу:
Код:
[Выделить все]
 Private Sub AcadDocument_BeginCommand(ByVal CommandName As String)
    ' Этот пример перехватывает событие BeginCommand.
    MsgBox "Выполнена команда: " & CommandName
End Sub
В Referens добавляю и подключаю "AutoCAD 2009 Type Library"
Компилирую, закидываю в папку доверенных мест.
Но реакции 0.
При отладке тоже, такое чувство что это не поддерживается.
Может кто знает в чём причина или простейший пример есть ?
Просмотров: 6801
 
Непрочитано 02.06.2016, 18:38
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


1. Вы бы весь код приложили бы, а не один метод.
2. Каким образом библиотека подключается к акаду?
3. Из того, что Вы опубликовали ничего работать и не должно...
Boxa вне форума  
 
Непрочитано 03.06.2016, 07:00
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
VB6
Серьёзно???

http://through-the-interface.typepad...ng_autoca.html

Последний раз редактировалось trir, 03.06.2016 в 07:15.
trir вне форума  
 
Автор темы   Непрочитано 03.06.2016, 12:31
#4
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 52


Цитата:
Сообщение от trir Посмотреть сообщение
Серьёзно???
Да.
Цитата:
Сообщение от trir Посмотреть сообщение
http://through-the-interface.typepad...ng_autoca.html
Ссылка не открывается...
Erbol2014 вне форума  
 
Непрочитано 03.06.2016, 12:46
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Создаю свою dll в VB6
это как?

Цитата:
нажатие кнопок мыши
и BeginCommand немножко разные вещи

Код:
[Выделить все]
   Public Sub Initialize() _
      Implements IExtensionApplication.Initialize
      Dim dm As DocumentCollection
      dm = Application.DocumentManager()
      AddHandler dm.DocumentLockModeChanged, _
        AddressOf vetoCommandIfInList
    End Sub

    Private Sub vetoCommandIfInList(ByVal sender As Object, _
      ByVal e As DocumentLockModeChangedEventArgs)
      If (cmdList.Contains(e.GlobalCommandName.ToUpper())) Then
        e.Veto()
      End If
    End Sub
trir вне форума  
 
Автор темы   Непрочитано 03.06.2016, 13:54
#6
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 52


Цитата:
Сообщение от trir Посмотреть сообщение
это как?
1.Пуск-Программы-Microsoft Visual Basic 6.0
2.Создать новый проект - ActiveX DLL
3.Создается класс - Класс1
4. В классе вписываю:
Private Sub AcadDocument_BeginCommand(ByVal CommandName As String)
' Этот пример перехватывает событие BeginCommand.
MsgBox "Выполнена команда: " & CommandName
End Sub
5.Проект-Информация-Подключить "AutoCAD 2009 Type Library"
6. Файл - создать dll, создаю.
Закидываю в папку доверенных мест.
По аналогии с этим:
http://www.cad.dp.ua/sovets/cr_tool.php
Аналог меню работает, а мой код не реагирует.

Цитата:
Сообщение от trir Посмотреть сообщение
и BeginCommand немножко разные вещи
Приведённый Вами код от .Net он не подходит.
Erbol2014 вне форума  
 
Непрочитано 03.06.2016, 13:58
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


и не должен
trir вне форума  
 
Автор темы   Непрочитано 03.06.2016, 14:09
#8
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 52


Цитата:
Сообщение от trir Посмотреть сообщение
и не должен
Не должен работать вообще в VB6 или не должен работать от .Net в VB6 (второе понятно)
А как же тогда отслеживать события если подключаться через СОМ ?:
Set Acad = CreateObject("AutoCAD.application")
Erbol2014 вне форума  
 
Непрочитано 03.06.2016, 14:47
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Нда... тут даже попробовать не на чем, так что просто процитирую код из справки, надеюсь разберетесь.

Код:
[Выделить все]
Public WithEvents ACADApp As AcadApplication    ' Use with Application Event Examples
Sub Example_AcadApplication_Events()
    ' This example initializes the public variable (ACADApp), which will be used
    ' to intercept AcadApplication Events
    '
    ' The VBA WithEvents statement makes it possible to intercept a generic object
    ' with the events associated with that object.
    '
    ' Before you will be able to trigger any of the AcadApplication events,
    ' you will need to run this procedure.

    ' We could get the application from the ThisDocument object, but that would
    ' require having a drawing open, so we get it from the system.
    Set ACADApp = GetObject(, "AutoCAD.Application.19")
End Sub

Private Sub ACADApp_AppActivate()
    ' This example intercepts an Application AppActivate event.
    '
    ' This event is triggered when the AutoCAD application receives focus
    '
    ' To trigger this example event:
    '     1) Make sure to run the example that initializes
    '     the public variable (named ACADApp) linked to this event.
    '
    '     2) Switch focus from AutoCAD to another Windows application
    '     and then back again.

      MsgBox "AutoCAD was just activated!"
End Sub

Private Sub ACADApp_BeginCommand(ByVal CommandName As String)
    ' This example intercepts a drawing BeginCommand event.
    '
    ' This event is triggered when a drawing receives
    ' any command compatible with this event.
    '
    ' To trigger this example event: Issue any command to an open drawing from
    ' either the command line, VBA, the AutoCAD menus, the AutoCAD toolbars, or LISP.

    ' Use the "CommandName" variable to determine which command was started
    MsgBox "A drawing has just been issued a " & CommandName & " command."
End Sub
ЗЫ.
акад 2009 + VB6, в 2016 году... Мусье знает толк в извращениях.

ЗЫЫ.
1. Автокаду пофигу куда Вы свою библиотеку положите, сам он ее никогда загружать не будет.
2. Dll библиотеки автокад понимает только .net-овские, соответственно для VB6 нужно внешнее exe приложение, которое и будет следить за автокадом.

Последний раз редактировалось Boxa, 03.06.2016 в 14:53.
Boxa вне форума  
 
Непрочитано 03.06.2016, 15:55
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


можно изнутри запустить, но тогда нужен VBA, Lisp, dotNET...
trir вне форума  
 
Непрочитано 03.06.2016, 16:13
#11
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от trir Посмотреть сообщение
можно изнутри запустить, но тогда нужен VBA, Lisp, dotNET...
Справка говорит, что лисп такого не умеет (вроде бы), а в остальном, зачем тогда все эти пляски с VB6 + dll, если можно и проще, это сделать изнутри на VBA и .NET?
Вот если бы автор топика написал зачем ему это все надо и что он в итоге хочет получить, то и советы были бы точнее...
Boxa вне форума  
 
Непрочитано 03.06.2016, 16:19
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Справка говорит, что лисп такого не умеет
глаза боятся, руки делают
trir вне форума  
 
Непрочитано 03.06.2016, 17:14
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


смотрите в сторону acedRegisterFilterWinMsg
Сергей812 вне форума  
 
Непрочитано 04.06.2016, 04:30
#14
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Если так уж приспичило использовать VB6 вместо VBA, то сначала полезно прочитать Дэйл Роджерсон - Основы COM
gomer вне форума  
 
Автор темы   Непрочитано 04.06.2016, 08:07
#15
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 52


Цитата:
Сообщение от Boxa Посмотреть сообщение
просто процитирую код из справки
Так я его и использую.
Цитата:
Сообщение от Boxa Посмотреть сообщение
Dll библиотеки автокад понимает только .net-овские
Вот это я и спрашивал, спасибо за подсказку.
Цитата:
Сообщение от Boxa Посмотреть сообщение
VB6 нужно внешнее exe приложение, которое и будет следить за автокадом.
А вот тут не получается.
Подключаюсь из exe к Автокаду при помощи
Код:
[Выделить все]
Set Acad = CreateObject("AutoCAD.application")
Но
Код:
[Выделить все]
Private Sub ACADApp_BeginCommand(ByVal CommandName As String)
вообще не реагирует.
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вот если бы автор топика написал зачем ему это все надо и что он в итоге хочет получить, то и советы были бы точнее...
Требуется отслеживание нажатия определённой кнопки в на панели автокада (кнопка будет своя, но в качестве примера кнопка "Отрезок"- "Line"), а потом тупо запись в отчёт сколько раз её жмякнули, и потом другие команды и другие отчёты.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
смотрите в сторону acedRegisterFilterWinMsg
Тут не понял, это отследит факт нажатия кнопок, но как понять по какой команде в Автокаде ?

Собственно вопрос переходит в стадию - как отследить из .exe VB6 действия в автокаде (такие как ACADApp_BeginCommand) ?
Erbol2014 вне форума  
 
Непрочитано 04.06.2016, 10:05
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
Требуется отслеживание нажатия определённой кнопки в на панели автокада (кнопка будет своя, но в качестве примера кнопка "Отрезок"- "Line"), а потом тупо запись в отчёт сколько раз её жмякнули, и потом другие команды и другие отчёты.
1. Если кнопка своя, что мешает на нее повесить лисп, который помимо выполнения основной функции пишет в файл лог?
2. Перехват сообщения о команде на уровне документа - CommandWillStart. Хотя, возможно, лучше будет подвешиваться на CommandEnded - чтобы в лог писало о завершенных командах только.


Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
Собственно вопрос переходит в стадию - как отследить из .exe VB6 действия в автокаде (такие как ACADApp_BeginCommand) ?
Насколько помню - для этого надо сделать кучу дополнительных телодвижений: регистрировать ваше приложение как COM-сервер, сообщить акаду - что он должен отправлять туда сообщения и т.д. Конкретно для акада не видел, видел описание процесса для офиса, насколько помню. И пришел к выводу - что работать с событиями извне приложения, где происходят эти события - без очень острой необходимости не стоит.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.06.2016, 11:54
#17
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 52


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
1. Если кнопка своя, что мешает на нее повесить лисп, который помимо выполнения основной функции пишет в файл лог?
С лиспом не дружу, да и куча необходимых действий помимо лога делается VB6.
Мне бы реальное направление куда копать...
Erbol2014 вне форума  
 
Непрочитано 04.06.2016, 12:02
#18
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
С лиспом не дружу, да и куча необходимых действий помимо лога делается VB6.
Мне бы реальное направление куда копать...
А что мешает реализовать команду на кнопке из VBA и дальше стартануть Ваше внешнее приложение и передать ему имя команды...
Как то так ^C^C-vbarun "D:/1.dvb"!ThisDrawing.StartMyMetod

ЗЫ.
Это уже даже не костыли, эт прям коляска инвалидная.
Boxa вне форума  
 
Непрочитано 04.06.2016, 12:55
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
С лиспом не дружу, да и куча необходимых действий помимо лога делается VB6.
Мне бы реальное направление куда копать...
я и не предлагаю меряться силами с местными Мэтрами лиспа Код самый примитивный:
Код:
[Выделить все]
 
(setq gNameFileLog "d:\\operations.log")

(defun c:MyCommand( / lFLog)
	(setq lFLog (open gNameFileLog "A"))
	(write-line (strcat  (rtos (getvar "CDATE") 2) " " "MyCommand") lFLog)
	(close lFLog)
	; Здесь пошел вызов команды самой


	; Тихий выход из функции
	(princ)
)
ну по нормальному туда еще обработчик ошибок надо добавить. А лучше вообще вынести в виде отдельной функции, куда передается имя команды. И потом все запихать в fas от излишне любопытных пользователей.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как отследить события нажатие кнопок мыши ? (dll VB6)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с настройкой кнопок мыши в AutoCAD Mechanical 2006 lexabelic Вертикальные решения на базе AutoCAD 2 29.01.2016 12:48
Как сделать так чтобы при двойном нажатии колёсика мыши не срабатывала команда _.zoom _e? stinger88 AutoCAD 12 02.04.2014 08:48
Настройка кнопок мыши для AutoCAD 2006 Inner AutoCAD 29 24.05.2013 14:12
Не работает двойное нажатие средней кнопки мыши. at0m13 AutoCAD 2 23.11.2011 18:32
Использование кнопок мыши scarface AutoCAD 4 10.01.2009 15:17