Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как определить контрол под курсором?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

sergey9511

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по VBA/API
----------
Как идентифицировать MsForms контрол на MsForms.UserForm при прохождении над ним курсора мыши при НАЖАТОЙ КНОПКЕ?

Всего записей: 3 | Зарегистр. 23-03-2006 | Отправлено: 18:33 18-08-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если мышь перемещается по клиентской области окна, то оконная процедура получает сообщение WM_MOUSEMOV. Если нажата левая кнопка мыши, то оконная процедура получает сообщение WM_LBUTTONDOWN.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 21:33 01-10-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мой ответ актуален для с++/ассемблер, т.к. современный вижуал васик - интерпритатор. К API не никак не обращается. За него это делает виртуальная машина .NET. Так что если нужно работать на прямую с API - переходите, например, на ассемблер или лучше на с++. С ним намного проще, чем с асмом.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 17:35 02-10-2015
asutp2

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix, а VB разве когда то был компилируемым в машинный код?
И ваш совет VB-шнику о переходе на асм отлично решает его проблему ))))))))))) Сами то на чистом асм сколько написали программ для виндов? 0?

Всего записей: 791 | Зарегистр. 22-10-2004 | Отправлено: 20:13 02-10-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
asutp2, внимательно прочитайте вопрос. Начинается он так:
Цитата:
Вопрос по VBA/API  
. Если вы на васиком вызовите API, то вам памятник золотой во весь рост можно будет поставить + нобелевскую премию выдать. Ну не вызывает он API. Тут уж ничего не поделаешь. Обижайтесь на API: а чё они тут васиком не вызываются?
 
asutp2, вы лучше sergey9511 совет дельный дайте. Как это реализовать на API я частично ответил. Посоветуйте человеку как это реализовать на васике. Хотя, судя по вашей реакции, вы этого не знаете.
 
 

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 20:45 02-10-2015
asutp2

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix, небольшие примеры вызова API-функций из VB:
 
получает текущее системное время:
Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" _ (lpSystemTime As SYSTEMTIME)  
 
получает текстовое название языка по идентификатору:  
Declare Function VerLanguageName Lib "kerne132" Alias _ "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, _ ByVal nSize As Long) As Long
 
Ну что, засылай деньги на золото и нобелевскую премию, школото))))))))))
 
 
 
 
 

Всего записей: 791 | Зарегистр. 22-10-2004 | Отправлено: 08:38 03-10-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код откомпилилованый Васиком не работает с API. Вместо этого эти API вызывает интерпритатор. Поэтому формат функций будет как-то отличаться от формата API.
asutp2, вы класный чувак! Вас можно на разведку к врагу засылать: если попадётесь, то ничего не по незнанию не расскажите.
 
Васик не вызывает напрямую API. Только через виртуальную машину. Это может быть либо .NET либо если очень древняя версия, то посредством интерпритатора, который встраивается в откомпилированый exe. Любая программа в состоянии вызвать этот API. Проблема в том, что не все это делают на прямую.
 

Цитата:
Ну что, засылай деньги на золото и нобелевскую премию, школото))))))))))  

На нобелевскую премию пока не заработали а вот на шнобелевскую - вполне.
 
Это не вызов API, а просьба васика к интерпритатору этот API вызвать :

Цитата:
Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" _ (lpSystemTime As SYSTEMTIME)

Другими словами, здесь идёт обращение к каким-то наворотам .NET, а не к kernel32.dll. Так что этот GetSystemTime() из kernel32.dll вызывает .NET, а не сам васик.
 
Полный формат выглядит так (пряммамя цитата из MSDN):
void WINAPI GetSystemTime(  __out  LPSYSTEMTIME lpSystemTime);
 
В вашем примере васик не управляет порядком передачи аргументов в стек. Ассемблер и C++ это делают, т.к. вызывают API на прямую обращаясь к напрямую системе WINDOWS.
 
 
 
 
 
 
 
Добавлено:
Я тут не хотел задеть тут чувства искренне верующих. Если задел - прошу прощения.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:53 03-10-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В VBA (aka Visual Basic 6) вызывает, если прога в нативном коде скомпилирована.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 18:35 03-10-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В VBA (aka Visual Basic 6) вызывает, если прога в нативном коде скомпилирован

В обход своего интерпритатора? Это противоречит идеологии автоматического управления процессом выполнения файла. Нативное имя всёравно будет в контексте ситаксиа Васика. Поэтому вызов всё равно пойдёт через интерпритатор. Чтобы проверить моё предположение, можно открыть такой экзэшник, например (и лучше всего), в IDA. И если она выдаст текст отличный от асма, то все вызовы идут через интерпритатор. Мне это, чесно говоря, лень проверять.
Это конечно, если компилятор Васика не имеет какие-то ключи, приказываючие компилятору переводить исходник в машинный код. В такие интимные подробности Васика я не влазил.
И потом, нативный код - это уже не API. Я имею ввиду то, что именно API и вызывает этот нативный код. Просто фишка в том, что этот нативный код нигде официально не описан и может быть изменён Microsoft в любом обновлении. И программа с таким кодом не на всех системах будет работать, потому, что не будет сохранена совместимость. А вот с  API такой проблемы не будет.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 20:42 03-10-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нативный код и есть машинный код, пи код- интерпертируемый, ну и ещё бейсик .NET существует вроде.
Большинство программ, которые мне попадались, были откомпилированы именно в нативе.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 21:23 03-10-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я просто думал, что речь идёт о нативных API.
Любой файл на компе hex-редактор может представить как последовательность 0 и 1.
Вижуал Васик 6 просто дописывает в свой экзешник интерпритатор. Актуальная версия Васика - нет. Его интерпритатор .NET. Если эти экзэшники открыть в OllyDbg, то будет какой-то асмовский текст. Который, естественно, скорее всего не будет поддаваться отладке. Если IDA содержит сигнатуры Васика то она выдаст текст который компилятор Васика сгенерировал. Этот код - промежуточный. Т.е. пи код. Под эти пи коды отладчики специальные пишут (Вижуал Васик, Делфи, Вижуал С++). .NET то же пи код ну и то, что в скобках. То, что в скобках -  .NET. Я имею ввиду актуальные версии. Снесёшь .NET - всё на что окажуться эти программы способны это вывести вякалку: "Верни .NET обратно!".
У всего этого есть один существенный плюс: простота разработки приложений с графическим интерфейсом. Других, как по мне, нет.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 23:05 03-10-2015
asutp2

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix, дружище, ты хоть понимаешь, что несешь?))) ты наверное капитан очевидность, говоря о том, что интерпретируемый код вызывает API не напрямую, а через интерпретатор?))))) В самом начале ты утверждал, что на VB вообще невозможно использовать API)))))))  
 
Программисту на VB глубоко фиолетово, каким образом происходит непосредственный вызов API. Для него важно, что на VB есть возможность обращения к API.  
 
Хотя да, с кем я спорю, ты же на чистом асме пишет код для виндов, таких людей во всем мире по пальцам можно пересчитать. И вот он ты, гуру, несущий нам познания! ))))))
 
Добавлено:
В стек при вызове API кстати как параметры ложишь, слева направо или справа налево?
 
Добавлено:

Цитата:
Т.е. пи код. Под эти пи коды отладчики специальные пишут (Вижуал Васик, Делфи, Вижуал С++). .NET то же пи код ну и то, что в скобках. То, что в скобках -  .NET. Я имею ввиду актуальные версии. Снесёшь .NET - всё на что окажуться эти программы способны это вывести вякалку: "Верни .NET обратно!".  

Сразу не увидел ЭТО, видимо мой мозг пытался защитить меня от такого бреда.
Оказывается скомпилированные программы, написанные на делфи и визуал с++, без NET не запустятся? Как мне это развидеть?!, а то моя жизнь не будет больше прежней......

Всего записей: 791 | Зарегистр. 22-10-2004 | Отправлено: 21:07 04-10-2015 | Исправлено: asutp2, 09:25 05-10-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как определить контрол под курсором?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru