Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'97-переводчике).
То есть:
1. Пользователь в программе задает комбинацию клавиш;
2. Программа инициализирует клавиатурный Hook, где при инициализации в переменные (из DLL(!)) записывает код этой комбинации.
3. В Hook'е при нажатии клавиш сравниваются коды нажатых клавиш и той комбинации, что в переменных (из DLL(!)). Если они совпадают, происходит активизация моей программы (если она свернута или неактивна).
Так вот ПРОБЛЕМА:
Переменные из DLL содержат код клавиши всплытия ТОЛЬКО когда моя программа АКТИВНА, иначе там ноль. Как следствие, если программа неактивна, то Hook обрабатывается, но коды клавиш, даже если нажата нужная комбинация не отрабатываются и программа не активизируется.
Впечатление, что эти переменные из DLL принадлежат области видимости переменных только моей программы, но они-то описаны в DLL!
Почему? Работает ли подобное под Delphi'ями или может есть отличия в работе при описании переменных в DLL на Delphi и BCB? Вроде как один пень, где делать, модуль-то независим от языка!
P.S. Если вариант, что мне нужен не проходит, то как реализовать его, если еще учесть, что:
1. Нежелательно использование реестра для хранения комбинации клавиш;
2. Нежелательно использование временного файла.
P.S.2. Если вдруг необходимо — DLL создается без VCL.
Здравствуйте Evgen, Вы писали:
E>Здравствуйте, все!
E>Вопрос по клавиатурному Hook'у.
E>Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'97-переводчике).
Здравствуйте Evgen, Вы писали:
E>Здравствуйте, все!
E>Вопрос по клавиатурному Hook'у.
E>Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'97-переводчике). E>То есть: E>1. Пользователь в программе задает комбинацию клавиш; E>2. Программа инициализирует клавиатурный Hook, где при инициализации в переменные (из DLL(!)) записывает код этой комбинации. E>3. В Hook'е при нажатии клавиш сравниваются коды нажатых клавиш и той комбинации, что в переменных (из DLL(!)). Если они совпадают, происходит активизация моей программы (если она свернута или неактивна).
E>Так вот ПРОБЛЕМА: E>Переменные из DLL содержат код клавиши всплытия ТОЛЬКО когда моя программа АКТИВНА, иначе там ноль. Как следствие, если программа неактивна, то Hook обрабатывается, но коды клавиш, даже если нажата нужная комбинация не отрабатываются и программа не активизируется. E>Впечатление, что эти переменные из DLL принадлежат области видимости переменных только моей программы, но они-то описаны в DLL!
E>Почему? Работает ли подобное под Delphi'ями или может есть отличия в работе при описании переменных в DLL на Delphi и BCB? Вроде как один пень, где делать, модуль-то независим от языка!
E>P.S. Если вариант, что мне нужен не проходит, то как реализовать его, если еще учесть, что: E> 1. Нежелательно использование реестра для хранения комбинации клавиш; E> 2. Нежелательно использование временного файла.
E>P.S.2. Если вдруг необходимо — DLL создается без VCL.
E>Спасибо, до свидания.
Если не принципиально, я бы посоветовал тебе использовать RegisterHotKey. По крайней мере, это проще и система будет меньше тормозить
Здравствуйте Evgen, Вы писали:
E>Здравствуйте, все!
E>Вопрос по клавиатурному Hook'у.
E>Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'97-переводчике). E>То есть: E>1. Пользователь в программе задает комбинацию клавиш; E>2. Программа инициализирует клавиатурный Hook, где при инициализации в переменные (из DLL(!)) записывает код этой комбинации. E>3. В Hook'е при нажатии клавиш сравниваются коды нажатых клавиш и той комбинации, что в переменных (из DLL(!)). Если они совпадают, происходит активизация моей программы (если она свернута или неактивна).
E>Так вот ПРОБЛЕМА: E>Переменные из DLL содержат код клавиши всплытия ТОЛЬКО когда моя программа АКТИВНА, иначе там ноль. Как следствие, если программа неактивна, то Hook обрабатывается, но коды клавиш, даже если нажата нужная комбинация не отрабатываются и программа не активизируется. E>Впечатление, что эти переменные из DLL принадлежат области видимости переменных только моей программы, но они-то описаны в DLL!
E>Почему? Работает ли подобное под Delphi'ями или может есть отличия в работе при описании переменных в DLL на Delphi и BCB? Вроде как один пень, где делать, модуль-то независим от языка!
E>P.S. Если вариант, что мне нужен не проходит, то как реализовать его, если еще учесть, что: E> 1. Нежелательно использование реестра для хранения комбинации клавиш; E> 2. Нежелательно использование временного файла.
E>P.S.2. Если вдруг необходимо — DLL создается без VCL.
E>Спасибо, до свидания.
Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.
Y>Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.
Напишите подробно если можно, я столкнулся с таким проблемом.
Паата
Здравствуйте Yerba, Вы писали:
Y>Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.
Sorry, имхо это очень смахивает на неправду. В делфе должны быть директивы, точно так же указывающие линкеру создать разделяемую секцию. И об этом лучше спросить в несколько другом форуме.
P.S. Мне кажется, в какой-то "кулибе" видел нечто соответствующее.
---
С уважением,
Игорь
Re[3]: Все про hook's
От:
Аноним
Дата:
21.05.02 09:27
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:
ИВ>Sorry, имхо это очень смахивает на неправду. В делфе должны быть директивы, точно так же указывающие линкеру создать разделяемую секцию. И об этом лучше спросить в несколько другом форуме.
ИВ>P.S. Мне кажется, в какой-то "кулибе" видел нечто соответствующее.
Может и есть (но почему то все на Дельфе используют MMF), но создавать глоб. Hook`и лучше на Асме так как это просто и dll выходит очень маленькой (от 2 Kb такой же на Delphi от 9Kb).
Здравствуйте Игорь Вартанов, Вы писали:
ИВ>Здравствуйте Yerba, Вы писали:
Y>>Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.
ИВ>Sorry, имхо это очень смахивает на неправду.
Но, увы, это факт. Дельфя управлять сегментами и линкером не позволяет