Все про hook's
От: Evgen Россия  
Дата: 20.05.02 09:36
Оценка:
Здравствуйте, все!

Вопрос по клавиатурному Hook'у.

Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'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.

Спасибо, до свидания.
Re: Все про hook's
От: Trantor Россия  
Дата: 20.05.02 09:43
Оценка:
Здравствуйте Evgen, Вы писали:

E>Здравствуйте, все!


E>Вопрос по клавиатурному Hook'у.


E>Есть необходимость сделать активизацию своей программы по нажатию определенной комбинации клавиш (кто знает, это как в Сократе'97-переводчике).


skip

E>Спасибо, до свидания.


А зачем для этого делать хуки? Можно вот так

RegisterHotKey(hButton,ID_HOTKEY,MOD_ALT,81);//ALT+Q
...
UnregisterHotKey(hButton,ID_HOTKEY);


Или я что-то не так понял...
В жизни мало быть умным, надо еще быть не дураком.
Re: Все про hook's
От: Gibbel Россия  
Дата: 20.05.02 09:44
Оценка:
Здравствуйте 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. По крайней мере, это проще и система будет меньше тормозить

Re: Все про hook's
От: Yerba Казахстан  
Дата: 20.05.02 09:46
Оценка:
Здравствуйте 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.
Re[2]: Все про hook's
От: Paata1 Грузия  
Дата: 21.05.02 03:50
Оценка:
Y>Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.

Напишите подробно если можно, я столкнулся с таким проблемом.
Паата
Re[2]: Все про hook's
От: Игорь Вартанов Ниоткуда  
Дата: 21.05.02 08:50
Оценка:
Здравствуйте 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).
Re[3]: Все про hook's
От: Алексей Петров Россия  
Дата: 21.05.02 09:36
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>Здравствуйте Yerba, Вы писали:


Y>>Лучше писать на Асме так как в Дельфи придется использовать временные файлы и т.д.. А в Асме линкеру задаешь доп-й атрибут /section:.bss,S при линковке dll — это сделает переменные разделяемыми для всех процессов использующих этот dll.


ИВ>Sorry, имхо это очень смахивает на неправду.

Но, увы, это факт. Дельфя управлять сегментами и линкером не позволяет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.