Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 567
от 14.06.2003, 12:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 3468 Отправлено ответов: 10193 Активность: 293.9 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
masquer Статус: Профессиональный Общий рейтинг: 137.9 [Подробней >>] |
_vt Статус: Опытный Общий рейтинг: 122.17 [Подробней >>] |
Дмитрий Статус: Опытный Общий рейтинг: 141.33 [Подробней >>] |
DiGiT[old] Статус: Профессиональный Общий рейтинг: 111.1 [Подробней >>] |
Hayk Статус: Доверительный Общий рейтинг: 112.06 [Подробней >>] |
Ramzes Статус: Профессиональный Общий рейтинг: 125.84 URL: Microsoft homepage [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 152.01 URL: Программирование [Подробней >>] |
baldr Статус: Профессиональный Общий рейтинг: 112.32 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 118.67 [Подробней >>] |
Tigran K. Kalaidjian Статус: Опытный Общий рейтинг: 118.52 URL: Методы оптимизации работы ПК [Подробней >>] |
St Статус: Опытный Общий рейтинг: 107.59 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 3410. Здравствуйте. У меня немного странный вопрос: Можно ли во время выполнения получить имя функции (в в... (ответов: 4)
Вопрос № 3411. Привет, эксперты! Не подскажите, что можно почитать по синтаксическому анализу. Желательно в электро... (ответов: 1)
Вопрос № 3412. Здравствуйте! У меня небольшой коментарий к Вопросу № 3365 насчет хуков перехвата клавиатуры и связа... (ответов: 3)
Вопрос № 3413. Добрый день ! Спасибо за предыдущие ответы. Не знаю насколько вопрос в тему, но мне кажется, что он ... (ответов: 3)
Вопрос № 3414. Всем здрасте Вопрос по поводу модемов Вот есть любая программа для работы с модемами. Как правило, в... (ответов: 3)
Вопрос № 3415. Здраствуйте уважаемые эксперты! Помогите, пожалуйста, с кодом. В следующей строке хочу поместить end... (ответов: 3)
Вопрос № 3417. На вопрос 3399 пришёл ответ ,что стартует система по адресу ffff:0000 .Но ведь там стоит инструкция ... (ответов: 3)
Вопрос № 3418. Здравствуйте! У меня на ноутбуке стоит инфракрасный порт. Я хочу сделать пульт управления к кондицио... (ответов: 1)
Вопрос № 3419. Уважаемые эксперты! Подскажите пожалуйста, можно ли сделать операцию добавления текста в edit contro... (ответов: 2)
Вопрос № 3420. Дико извиняюсь, за повторный оффтопик, но в вопрсе №3409, допустил досадные ошибки в адресах :( Post... (ответов: 1)
Вопрос № 3421. Привет Bob Johnson! Огромное вам спасибо за помощь (вопрос № 3412)!!! Уже не первый раз ваши подсказ... (ответов: 1)
Вопросов: 11, ответов: 25
Вопрос № 3410 |
Здравствуйте.
У меня немного странный вопрос:
Можно ли во время выполнения получить имя функции (в виде строки)в которой сейчас происходит выполнение?
procedure TfrmMain.ButtonRedClick(Sender: TObject);
begin
s:=(some function);
//as result s='ButtonRedClick'
end;
Спасибо.
Может быть нужна подпрограмма на ассемблере?
Или это в принципе невозможно?
Вопрос отправлен: 09.06.2003, 11:23
Отправитель: Serg
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, Serg!
Если есть отладочная информация (не знаю как с этим в борландовских поделках обстоит) в виде pdb файла, то можно, но я бы поискал другой вариант.
Ответ отправлен: 09.06.2003, 12:16
Отправитель: masquer
Отвечает _vt
Здравствуйте, Serg!
Непонятна цель... Ну и напиши в теле каждой процедуры s:="ProcName"...
Если это нужно для отладки, научись пользоваться пошаговым выполнением и расстановкой контрольных точек в нужных процедурах.
---===*** Testing E-Man 1.1...***===---
Ответ отправлен: 09.06.2003, 23:48
Отправитель: _vt
Отвечает Дмитрий
Здравствуйте, Serg!
Если имеется символьная информация, то по ординалу функции возможно определить ее имя. Хотя зачем это делать на практике? Если ты вызываешь функцию, то ты же знаешь, какую функцию ты вызываешь. А для функций уже написанных кем-то это вообще не имеет смысла (они уже скомпилированы!). С другой стороны, есть такая фишка. Пример приведу на Java, потому-что лучше всего знаю этот язык. В полностью объектно-ориентированной системе все объекты наследуются от одного суперобъекта. В Java это Object (хотя, по-моему в Delphi это не так). В классе Object имеется метод toString, возвращающий описание объекта в строковом представлении. Если Дочерние классы не перегрузили метод toString, то скажем MyButton.toString() вернет описание этого объекта (в частности, его имя). Так, что имя объекта получить не трудно, но с методами дела обстоят чуть сложнее, т. к. в большинстве случаев символьной информации, характеризующей функцию просто нет (может данный метод является методом суперкласса? как это определишь при выполнении?).
Ответ отправлен: 10.06.2003, 06:18
Отправитель: Дмитрий
Отвечает DiGiT[old]
Здравствуйте, Serg!
Вообще говоря это спецификация компилятора. Понимает ли он текстовые имена функций или нет.
Вообще говоря, имена функции как таковые нужны, для понимания программистом. А потом они преобразуются в адреса. Это минут дельфийского обучения, что программисты не понимают таких простых сущностей, а вот си дает понятную картину.
Ответ отправлен: 10.06.2003, 02:21
Отправитель: DiGiT[old]
Вопрос № 3411 |
Привет, эксперты!
Не подскажите, что можно почитать по синтаксическому анализу. Желательно в электронном виде. И, если не трудно, подскажите также ссылочки на инфу по булевой алгебре. Заранее благодарен, Дмитрий.
Вопрос отправлен: 09.06.2003, 12:52
Отправитель: Дмитрий (demetrius2003@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Hayk
Доброе время суток, Дмитрий!
Книгу Альфреда Ахо
Ответ отправлен: 09.06.2003, 15:11
Отправитель: Hayk
Вопрос № 3412 |
Здравствуйте!
У меня небольшой коментарий к Вопросу № 3365 насчет хуков перехвата клавиатуры и связанный с этим вопрос. Програма кейлоггер URiS (newff.narod.ru) работает, но только не в Word и Excel, как я убедился (на личном примере (програма автозавершения набираемых слов)) в таких сложных програмах при нажатии на одну клавишу происходит перехват двух (у меня) или трех (у программы URiS) сообщений от клавиатуры адресованных разным окнам. По всей видимости (мое видение проблемы), сначала сообщение от клавиатуры (и WM_KEYDOWN и WM_CHAR) приходит в главное окно програмы (оно называется Excel7), а то вместо того чтобы послать текст в окно с курсором (Excel6, наверное это оно) с помощью какого-нибудь user-сообщение {например}, посылает еще один набор WM_KEYDOWN и WM_CHAR сообщений. В связи с этим и вопрос - есть ли у кого-нибудь идея как можно отловить только сообщение посланное в окно, где реально отображается набираемый текст (окно с курсором или активное (по-моему оно так называется) окно), а не во все окна данного приложения?
St
Вопрос отправлен: 09.06.2003, 13:40
Отправитель: St (st23@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Ramzes
Доброе время суток, St!
Нет нельзя, потому что по всей вероятности это окно посылает другому сообщение при помощи SendMessage, вследствие чего в очередь сообщений посылается сообщение и ты его перехватываешь
Ответ отправлен: 10.06.2003, 18:06
Отправитель: Ramzes
Отвечает masquer
Приветствую Вас, St!
Смотрим МСДН по ключевому слову Transition State Flag, анализ этого флага и даст правильный результат.
2 Bob Johnson - ответ, мягко говоря, не в тему...
Ответ отправлен: 09.06.2003, 17:42
Отправитель: masquer
Отвечает Bob Johnson
Доброе время суток, St!
Для NT-систем вопрос решается очень просто - использовать хук WH_KEYBOARD_LL. Его процедура вызывается только когда кто-то нажал кнопку на клавиатуре или вызвали функцию keyb_event (что в принципе тоже самое). Но с его помощью невозможно отловить окно, которому посылается сообщение.
С другой стороны WH_KEYBOARD вызывается всегда, когда функция PeekMessage или GetMessage вытаскивает сообщение WM_KEYDOWN или WM_KEYUP. Т.е. если я буду вызывать 100 раз PeekMessage без извлечения сообщения, а потом еще раз GetMessage, то хук вызовется 101 раз. Если же приложение перешлет сообщение еще раз другому окну, то это с точки зрения Windows будет уже другое сообщение, которое по любому надо будет отослать хуку.
В общем, мне кажется, что решить эту проблему можно только самому анализируя сообщения и не записывая повторяющиеся. Использовать, например, функцию GetFocus, чтобы определить, какое окно сейчас должно получать сообщения от клавиатуры. и т.д.
Кстати про Excel - у меня главное окно называется XLMAIN, EXCEL7 - вся область, занимаемая книгой Excel, а EXCEL6 - появляется в том месте, где начинается ввод данных в ячейку.
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 09.06.2003, 17:26
Отправитель: Bob Johnson
Вопрос № 3413 |
Добрый день !
Спасибо за предыдущие ответы.
Не знаю насколько вопрос в тему, но мне кажется, что он связан с низкоуровневым программированием.
Проблема такая: принтер HP420 после 4-х лет работы стал глючить – при включении загорается лампочка пустого картриджа (в «нормальном» состоянии она должна оповещать о том, что закончились чернила), выдвигается каретка и печать невозможна. Многократное включениевыключение не помогает. Поменял картридж. Глюк не прошел. Моменял драйвера на HP400(Monochrome). Проблема решилась дня на два, больше не протянул. На первый взгляд это «железный» дефект, т.к. при выключенном компьютере глюки остаются. В тоже время, иногда (редко) принтер включается нормально и можно печатать. С другой стороны почему всё выправляется, если поменять дрова (тоже не всегда помогает) ??? Режимы менял – не помогает. Это не связано с моими экспериментами с LPT, т.к. та же фигня была на 486 компе у принтера HP400 после тех же 4-х лет работы. Мне кажется, что это ошибка, какой-то «вшитой» микропрограммы в ПЗУ принтера (если таковое вообще существует). Не знаю как разрешить эту проблему. Версии выкинуть и купить новый, пожалуйста, не предлагайте.
Вопрос отправлен: 09.06.2003, 15:24
Отправитель: Tigran Kalaidjian (kalaidjian@pochtamt.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Дмитрий
Добрый день, Tigran Kalaidjian!
Эта проблема, как ни странно, связана с низкоуровневым программирование самым непосредственным образом. В этом принтере надо перешивать ПЗУ. Однозначно! Был у меня случай. В моем ведении находилось несколько принтеров Epson FX1170. Практически одновременно у них начали появляться глюки: после печати одной строки принтер прокручивал лист немного вниз, оставляя пару строк пробелов. Таблицы выглядели просто ужасно! Самое интересное, что эта неполадка проявлялась не всегда! И глючок этот пропадал после пары часов работы принтера. В сервис центре перепрошивали ПЗУ через Centronix кабель с помощью какой-то проги. Они его даже не разбирали! После этого принтеры работали отлично. Правда один из них я возил в сервис-центр еще пару раз с такой-же поломкой. Видимо с первого раза что-то не получилось. У меня создается впечатление, что некоторые виды ПЗУ умирают постепенно, т. е. некоторые биты там "плавают" от нуля к единице. Если можно так сказать. Так, что мне кажется надо перепрошивать ПЗУ, если это возможно.
Ответ отправлен: 10.06.2003, 08:38
Отправитель: Дмитрий
Отвечает Hayk
Приветствую Вас, Tigran Kalaidjian!
IMHO загорание лампочки пустого картриджа уже говорит о том, что проблема не чисто-программная. Возможно проблема в каком-то из чипов принтера. А то что он время от времени то работает то глючит - думаю симптомы агонии.
Ответ отправлен: 09.06.2003, 15:36
Отправитель: Hayk
Отвечает Bob Johnson
Доброе время суток, Tigran Kalaidjian!
Обычно принтер определяет, что картридж пуст за счет того, что увеличивается сопротивление между двумя электродами, находящимися внутри чернильной емкости. Это отлично видно на дурацких принтерах Epson Stylus (кажется 1000), где заменяется не вся печатающая головка, а только чернильница.
Попробуй найти у себя эти электроды и замкнуть их (резистором или как еще, хоть мокрой бумажкой - помогает) и посмотреть на реакцию принтера. Может быть внутренний датчик, который сравнивает сопротивление с пороговым значением стал тупить, хотя тогда непонятно, чем помогает замена драйверов.
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 10.06.2003, 01:16
Отправитель: Bob Johnson
Вопрос № 3414 |
Всем здрасте
Вопрос по поводу модемов
Вот есть любая программа для работы с модемами. Как правило, в момент ее активации любая другая программа при попытке обращения к модему получит что то типа "Устройство занято другой программой". Так вот, у кого есть какие соображения по поводу проги, которая висела бы резидентом, могла бы обращаться с модемом и при этом другие проги также могли разделять модем.
Не в том смысле, что после подключения к интернету и качании данных другая программа вклинивается в траффик и перехватывает все данные, нет. Вот например APServer (или какой нить VentaFax). Если их запустить - все, ни одна другая программа к модему обратиться не может. Вот в этом проблема, как написать (и возможно ли такое вообще) программу, которая скрывала бы свою "связь" с модемом.
Это первый вопрос. Второй - как отловить момент, когда связь с провайдером установлена, отсылаются логин и пароль (это все через телнет понятно), и приходит ответ. Тут же в углу с часами появляется иконка двух соединенных компов. Так вот, как отловить этот момент?
Третий вопрос - как отловить момент разрыва связи
Вопрос отправлен: 09.06.2003, 16:06
Отправитель: Broken Sword (brokensword@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает baldr
Добрый день, Broken Sword!
В принципе, то, что ты описываешь, очень похоже на прокси-сервер! Попробуй установить прокси и переопределить порты, которые юзает этот VentaFax. Или, может, создать что-то типа виртуального соединения с прокси в качестве посредника... По идее, должно работать... :-//
Ответ отправлен: 09.06.2003, 21:34
Отправитель: baldr
Отвечает Bob Johnson
Добрый день, Broken Sword!
По поводу первого - ничего другого, кроме как подключаться к модему, выполнять нужную функцию и отключаться в голову не приходит. Представим, что модем внешний и подключен к com-порту, если одна программа открыла порт и работает с модемом (т.е. посылает ему AT-команды), то как другая вклинится и выполнит свое действие? Думаю, что никак.
Но есть одна любопытная ситуация - один мой знакомый говорит, что у него модем USR и когда он сидит в интернете, а ему приходит второй вызов (АТС - EWSD), то программа, которая шла в поставке с модемом вылазит и сообщает ему, что идет звонок. Более подробных объяснений, что за программа и все такое я от него добиться не смог, а сам у него пока еще не был. Может быть у него модем подключен по USB и там возможно как-то работать с модемом нескольким программам одновременно.
По второму и третьему ничего более умного, как переодически вызывать функцию RasEnumConnections в голову не приходит.
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 10.06.2003, 01:16
Отправитель: Bob Johnson
Отвечает Hayk
Приветствую Вас, Broken Sword!
На третий вопрос ... попробуйте функцию RegisterDeviceNotification ... но идентификатор модема объявлен в заголовочных файлах WinDDK. После этой функции надо отловить WM_DEVICECHANGE в оконной процедуре.
Ответ отправлен: 10.06.2003, 10:01
Отправитель: Hayk
Вопрос № 3415 |
Здраствуйте уважаемые эксперты!
Помогите, пожалуйста, с кодом.
В следующей строке хочу поместить endl
чтобы вывод каждый раз осуществлялся с
новой строки.
again: mov byte ptr [dta + 2Bh], endl ;0dh, 0ah,'$'
(см. приложение)
Т.е. по смещению dta + 2Bh надо добавить endl.
С уважением, Sammy
Приложение:
Вопрос отправлен: 09.06.2003, 17:52
Отправитель: Sammy (sfxgt666@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Доброе время суток, Sammy!
Вот вам...
---===*** Testing E-Man 1.1...***===---
Приложение:
Ответ отправлен: 09.06.2003, 23:48
Отправитель: _vt
Отвечает Ayl
Добрый день, Sammy!
Например, так:
again:
mov byte ptr [dta + 2Bh], 0dh
mov byte ptr [dta + 2Ch], 0ah
mov byte ptr [dta + 2Dh], '$'
Ответ отправлен: 09.06.2003, 18:25
Отправитель: Ayl
Отвечает Bob Johnson
Приветствую Вас, Sammy!
endl - это не один байт, это 2 байта, плюс '$' - еще байт.
пиши вот так:
mov byte ptr [dta + 2Bh], 0dh
mov byte ptr [dta + 2Ch], 0Ah
mov byte ptr [dta + 2Dh], '$'
или просто отдельно выводи 0Ah, 0Dh, '$' с помощью функции 9 после каждого имени файла.
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 10.06.2003, 01:16
Отправитель: Bob Johnson
Вопрос № 3417 |
На вопрос 3399 пришёл ответ ,что стартует система по адресу
ffff:0000 .Но ведь там стоит инструкция int 19.А векторы прерываний находяться в ОЗУ(с 0000:0000).При включении память ОЗУ чиста.Спрашиваеться куда прыгнет cs:ip(не с 0:0 же)???.
Вопрос отправлен: 09.06.2003, 21:38
Отправитель: Yuri
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Здравствуйте, Yuri!
Батенька, этот вопрос уже как-то проскакивал в рассылке...
Смотреть состояние памяти нужно не в виндах в DOS-сессии, а в голом DOS'е. Тогда у тебя по адресу ffff:0 будет не int 19, а far jump на процедуру старта. Винда же, видимо, для контроля за попыткой перезагрузки, в DOS-сессии по этому адресу записывается int 19.
Ответ отправлен: 10.06.2003, 17:35
Отправитель: Ayl
Отвечает _vt
Здравствуйте, Yuri!
На 0000:7C00
---===*** Testing E-Man 1.1...***===---
Ответ отправлен: 09.06.2003, 23:48
Отправитель: _vt
Отвечает Bob Johnson
Добрый день, Yuri!
Нет, там не стоит инструкции int 19 - может быть у тебя shadow включен и все такое - я вот прямо сейчас запустил td и сделал в нем goto 0FFFFh:0 и он мне показал jmp F000:E05B - и это вроде как правильно. Чтобы дизассемблировать BIOS возьми лучше файл прошивки, которую ты туда зашивал и посмотри в ней (только вот у меня BIOS 512 кб, а то, что будет находиться по адресу 0FFFF0h реально в файле находится по смещению 7FFF0h.
> При включении память ОЗУ чиста
Нет, при включении памяти в ней всякая фигня, но частично закономерная (где-то 0, где-то 1), но пологаться на информацию в ОЗУ при включении питания нельзя.
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 10.06.2003, 01:17
Отправитель: Bob Johnson
Вопрос № 3418 |
Здравствуйте!
У меня на ноутбуке стоит инфракрасный порт. Я хочу сделать пульт управления к кондиционеру. Раньше я сделал прогу управления портом ЛПТ используя функции драйвера NTPort Library. А когда я поднёс пульт кондиционера к IR порту впритык и стал нажимать и смотреть на мои 8 текстбоксов проги.... там (уже на IR) байт не менялся... тоесть видимо Windows просто поддерживает определённое значение на этом порту. По сему вопрос, как быть в такой ситуации? Может просто инфракрасный порт и пульты работают на разных частотах? Или может в сигналах у них период разный и комп сбивается? Не могли бы вы мне сказать где почитать про то какого рода сигналы нужны для управления инфракрасными утсройствами? (послылают ли они просто пару байт//слов или там нужен целый интерфейс для двухсторонне коммуникации...). Самое главное что меня волнует это то что могут чистоты света и период аналогого сетогого сигнала могут быть не совместимыми... Если кто чего знает расскажите pls.
To_Tigran: Если у вас есть по этому поводу доки.файлы, pls посылайте.
Вопрос отправлен: 10.06.2003, 07:33
Отправитель: Edward (zeleniy_kot@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Tigran K. Kalaidjian
Доброе время суток, Edward!
Каким ПО Вы пользуетесь? ИК-порт самодельный или встроенный?
Пробовали пользоваться WinLirc?
Достаточно много разборов схем, протоколов работы и прочего можно найти в журнале "Cooler"(там несколько выпусков посвящено дистанционному управлению).
Сайт журнала - http://cooler.emax.ru
Если не сможете там найти интересующей информации, то пишите на kalaidjian@pochtamt.ru, у меня этого добра навалом.
Ответ отправлен: 10.06.2003, 22:51
Отправитель: Tigran K. Kalaidjian
Вопрос № 3419 |
Уважаемые эксперты!
Подскажите пожалуйста, можно ли сделать операцию добавления текста в edit control (в конец существующего текста) лучше и если можно, то как.
Заранее спасибо!
Приложение:
Вопрос отправлен: 10.06.2003, 10:19
Отправитель: Konstantin
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Konstantin!
У вас все правильно: запомнить место курсора (EM_GETSEL), потом перенести его в конец текста (WM_GETTEXTLENGTH и EM_SETSEL), вставить новый текст (EM_REPLACESEL) и вернуть курсор на место (EM_SETSEL).
Можно еще получить доступ к памяти где содержится текст (EM_GETHANDLE и WM_GETTEXTLENGTH), скопировать в буфер, добавить свой текст к концу и вернуть текст в Edit (правда обычно это выгодно только если нужно БЫСТРО заменить или вставить много кусков текста).
St
Ответ отправлен: 10.06.2003, 12:20
Отправитель: St
Отвечает Bob Johnson
Приветствую Вас, Konstantin!
Видимо нет. Если ты будешь добавлять текст постепенно (например, по символу), то после очередной вставки курсор уже будет находиться в конце текста и перемещать его (первые 2 функции) не будет нужно.
Если же окажется, что в результате программа будет работать медленней, чем нужно, то можешь вначале получить от edit весь текст (WM_GETTEXT), после чего добавишь в его конец то, что нужно и занесешь его обратно (WM_SETTEXT).
* EMan1.1: ---===*** Eternal power ***===---
Ответ отправлен: 10.06.2003, 16:04
Отправитель: Bob Johnson
Вопрос № 3420 |
Дико извиняюсь, за повторный оффтопик, но в вопрсе №3409, допустил досадные ошибки в адресах :(
Post message:
TNTx@yahoogroups.com
Subscribe:
TNTx-subscribe@yahoogroups.com
Unsubscribe:
TNTx-unsubscribe@yahoogroups.com
List owner:
TNTx-owner@yahoogroups.com
Эксперты, отправте еще раз, плиз...спасибо.
Вопрос отправлен: 10.06.2003, 10:26
Отправитель: Maverick (Maverick@nightmail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Приветствую Вас, Maverick!
Отправляю
Ответ отправлен: 10.06.2003, 19:23
Отправитель: Ayl
Вопрос № 3421 |
Привет Bob Johnson!
Огромное вам спасибо за помощь (вопрос № 3412)!!! Уже не первый раз ваши подсказки решают проблемы c моими программами.
St
Вопрос отправлен: 10.06.2003, 12:37
Отправитель: St (st23@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, St!
Пожалуйста. Кстати, masquer прислал вот такую процедуру по этому же вопросу (на WH_KEYBOARD) - см. приложение.
В принципе, в этой процедуре стоит жесткая проверка на то, чтобы nCode был равен 0 (HC_ACTION); еще он может быть равен 3 (HC_NOREMOVE) - как раз в случае, когда вызывается peekmessage без извлечения сообщения, но за счет жесткого равенства такие сообщения будут игнорироваться. Uris, видимо, использовал что-то вроде (nCode >= 0), и отлавливал, таким образом, одно сообщение несколько раз.
Transition flag используется для указания, нажата была клавиша, или отпущена (в этом хуке это единственный способ это определить).
Следует также отметить, что из-за того, что процедура хука вызывается в контексте того приложения, которому адресовано сообщение от клавиатуры, то GetActiveWindow вернет правильный результат.
Еще в примере от VC++ (Spy, кажется) указано следующее: при вызове CallNextHookEx в качестве первого параметра (hHook) можно указывать 0, и windows все равно сама определит, кому и что передавать. Это позволяет значительно упростить написание хука, т.к. получить в другом процессе hHook будет достаточно проблематично.
* EMan1.1: ---===*** Eternal power ***===---
Приложение:
Ответ отправлен: 10.06.2003, 16:05
Отправитель: Bob Johnson
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (36) C / C++ (29) Perl (7) Builder / Delphi (20) Pascal (32) Basic / VBA (11) Java / JavaScript (12) PHP (8) MySQL / MSSQL (7) |
Пользователю Windows 95/98/Me (36) Windows NT/2000/XP (31) "Железо" (25) Поиск информации (16) |
Администратору Windows NT/2000/XP (15) Linux / Unix (8) |
Юристу Гражданское право (6) Семейное право (2) Трудовое право (3) КоАП (3) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А. |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||