Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];

Вниз

Глобальный хук на клавиатуру без dll.   Найти похожие ветки 

 
Cerberus ©   (2006-06-20 15:12) [0]

сабж


 
Сергей М. ©   (2006-06-20 15:13) [1]

Не проблема.
О том вещает MSDN.


 
Cerberus ©   (2006-06-20 15:18) [2]

> [1] Сергей М. ©   (20.06.06 15:13)

А можно поконкретней если не сложно.


 
TUser ©   (2006-06-20 15:26) [3]

exe тоже может экспортировать функции - пишется также в файле проекта


 
Сергей М. ©   (2006-06-20 15:42) [4]


> Cerberus ©   (20.06.06 15:18) [2]
> можно поконкретней


Нет ничего конкретней инф-ции в MSDN.
Есть проблемы ? Излагай ..


 
Leonid Troyanovsky ©   (2006-06-20 18:24) [5]


> Cerberus ©   (20.06.06 15:18) [2]

> А можно поконкретней если не сложно.


http://msdn.microsoft.com

--
Regards, LVT.


 
begin...end ©   (2006-06-20 18:32) [6]

В Windows NT 4.0 SP3 и выше -- WH_KEYBOARD_LL.


 
programania ©   (2006-06-20 19:00) [7]


PROCEDURE reg(nKey:string); // например reg("alt+shift+Z");
var i:integer;
begin
if rKey then begin
//удаление регистрации горячей клавиши
 unRegisterHotKey(form2.handle,32);
 rKey:=false;
end
else
begin
//регистрация горячей клавиши
 if pos("alt"  ,nKey)>0 then i:=MOD_ALT else i:=0;
 if pos("shift",nKey)>0 then i:=i+MOD_SHIFT;
 if pos("ctrl" ,nKey)>0 then i:=i+MOD_CONTROL;
 if i>0 then begin
   RegisterHotKey(form2.handle,32,i,ord(nKey[length(nKey)]));
   rKey:=true;
 end;
end;
end;

//обработка
procedure TForm2.WMHotkey(var a:TWMHotkey);
begin
if a.hotkey=32 then begin

end;
end;


работает в
http://programania.com/en_source.zip  12кб


 
begin...end ©   (2006-06-20 19:02) [8]

> programania ©   (20.06.06 19:00) [7]

Какое отношение это имеет к хукам? Тем более, к глобальным?


 
programania ©   (2006-06-20 20:30) [9]

Если в Windows произойдет событие нажатия заданой клавиши,
то будет вызвана заданная процедура это и есть hook на это событие
причем это произойдет при любой активной программе
это и есть глобальный hook


 
begin...end ©   (2006-06-20 21:53) [10]

> programania ©   (20.06.06 20:30) [9]

Разумеется, Вы можете называть карандаш ластиком, а ластик -- карандашом. Правда, от этого карандаш не начнёт стирать, а ластик не начнёт писать, но это, по-видимому, Вас не очень беспокоит.

Я же при описании чего-либо предпочитаю пользоваться  либо терминологией того, кто это "что-либо" создал, либо общепринятой терминологией. В данном случае -- терминологией Microsoft, которая, во-первых, введена "создателем" ОС, в которой эти самые хуки и устанавливаются, а во-вторых, является практически общепринятой. В MSDN написано следующее: "A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure."

Допустим, я хочу отслеживать сообщения WM_KEYDOWN (monitor the message traffic in the system) и, если нужно, изменять параметры этих сообщений до того, как они будут попадать в соответствующие оконные процедуры (process certain types of messages before they reach the target window procedure). Причём хочу отслеживать сообщения, отправляемые любому из потоков в системе. То есть, хочу установить глобальный хук на клавиатуру (по терминологии Microsoft).

Так вот -- если Вас не затруднит, приведите, пожалуйста, рабочее решение этой задачи с помощью глобального хука, но уже по Вашей терминологии, т.е. с помощью функции RegisterHotKey. Желаю успеха, и с нетерпением жду Вашего ответа.


 
Elen ©   (2006-06-21 11:54) [11]


> Cerberus
Глобальный хук на клавиатуру без dll.

А чем DLL мешает?


 
Rouse_ ©   (2006-06-21 13:22) [12]


> Если в Windows произойдет событие нажатия заданой клавиши,
>  
> то будет вызвана заданная процедура это и есть hook на это
> событие

Поразительно, вот уж не знал что это тоже называется хуком.
Рихтер нервно курит в сторонке :)


 
programania ©   (2006-06-21 19:36) [13]

>begin...end ©   (20.06.06 21:53) [10]

К сожалению мне пока не требовалось решать такие задачи
да я и не понял что вам еще конкретно нужно
возможно вы не знаете как передать перехваченное
нажатие активному окну, так это можно сделать примерно так
SendMessage(GetForegroundWindow,WM_CHAR,wparam,0);
однако мне кажется что вы и сами прекрасно разберетесь


 
Yanis ©   (2006-06-21 19:45) [14]


> возможно вы не знаете как передать перехваченное
> нажатие активному окну

:D


 
begin...end ©   (2006-06-21 22:35) [15]

> programania ©   (21.06.06 19:36) [13]

> К сожалению мне пока не требовалось решать такие задачи

К сожалению, это типичная задача, для которой используются ловушки. Непонятно, почему Вы считаете возможным давать советы, не имея опыта решения даже типичных задач по теме вопроса.

> да я и не понял что вам еще конкретно нужно

Странно. По-моему, в [10] задание сформулировано достаточно чётко: перехватывать WM_KEYDOWN до того, как оно попадёт в оконную процедуру.

> возможно вы не знаете как передать перехваченное
> нажатие активному окну, так это можно сделать примерно так
> SendMessage(GetForegroundWindow,WM_CHAR,wparam,0);

Спасибо, но с тем, как послать сообщение окну, я, слава Аллаху, знаком. Правда, непонятно, зачем перехваченное нажатие куда-то посылать -- при использовании хука оно само дойдёт туда, куда надо (после того, как на него посмотрят внутри функций цепочки ловушек).

> однако мне кажется что вы и сами прекрасно разберетесь

К сожалению, Вы ошибаетесь. Без Вас разобраться в том, как можно функцией RegisterHotKey установить глобальный хук на клавиатуру, мне вряд ли удастся. Поэтому всё же хотелось бы увидеть решение задачи -- думаю, оно будет интересно не только мне.

Впрочем, решение можно и не приводить, а вместо этого согласиться с тем, что RegisterHotKey к установке глобальных клавиатурных хуков отношения не имеет. И извиниться перед автором вопроса за то, что Вы ввели его в заблуждение. После этого тема будет исчерпана.

Жду ответа.


 
ors_archangel ©   (2006-06-22 16:24) [16]

Надо AttachThreadInput попробовать, чёрт, у меня щас delphi нет под рукой!!!


 
begin...end ©   (2006-06-22 18:43) [17]

> ors_archangel ©   (22.06.06 16:24) [16]

Надеюсь, Вас тоже не затруднит привести рабочий пример установки ГЛОБАЛЬНОГО хука с помощью AttachThreadInput.


 
programania ©   (2006-06-22 19:26) [18]

>begin...end ©   (21.06.06 22:35) [15]
>К сожалению, это типичная задача, для которой используются ловушки.

Совершенно верно,
я думаю что создав SetWindowsHookEX ее создатели ужаснулись
делу рук своих и решили что американский человек никогда этого не поймет и
поэтому для самого типового использования ловушек и создали RegisterHotKey
спрятав все хуки внутрь что вас и смутило

>перехватывать WM_KEYDOWN до того, как оно попадёт в оконную процедуру.

при использовании RegisterHotKey, WM_KEYDOWN вообще не попадает
в процедуру активного окна, а только в процедуру окна указаного при регистрации
поэтому я и решил что вам нужно все-таки передать в активное окно

>Правда, непонятно, зачем перехваченное нажатие куда-то посылать
>-- при использовании хука оно само дойдёт туда, куда надо

Так вы же просили: "т.е. с помощью функции RegisterHotKey." [10]

>а вместо этого согласиться с тем, что RegisterHotKey к установке
>глобальных клавиатурных хуков отношения не имеет

Тут я могу согласиться что RegisterHotKey не так универсальна как SetWindowsHookEX
и можете называть ее как хотите, но она решает ту же задачу для клавиатуры проще
и не требует dll что и нужно для решения вопроса темы

>ors_archangel ©   (22.06.06 16:24) [16]
Надо AttachThreadInput попробовать, чёрт, у меня щас delphi нет под рукой!!!

После AttachThreadInput программа конечно будет получать все нажатия
но только потому что получит фокус, а для клавиатурного шпиона это недопустимо


 
begin...end ©   (2006-06-22 20:05) [19]

> programania ©   (22.06.06 19:26) [18]

> RegisterHotKey не так универсальна как SetWindowsHookEX
> и можете называть ее как хотите, но она решает ту же задачу
> для клавиатуры проще

Какую "ту же задачу"? Я в [10] попросил Вас решить задачу, а в [15] повторил просьбу. Могу повторить условие ещё раз: перехватывать ВСЕ сообщения WM_KEYDOWN до того, как они попадут в целевые оконные процедуры.

Вы только что (в [18]) согласились с тем, что эта задача -- типичная для использования хуков. Ранее (в [7] и [9]) Вы утверждали, что установить глобальный хук можно функцией RegisterHotKey.

Получается, что задачу, о которой я говорю, можно решить за счёт этой функции. Так Вы можете решить её, или нет? Жду ответа.


 
programania ©   (2006-06-22 21:39) [20]

>begin...end ©   (22.06.06 20:05) [19]
>Так Вы можете решить её, или нет?

Могу,
причем именно до того, как они попадут в целевые оконные процедуры
и хотя не уверен насчет всех сообщений,
но те что получает FormKeyDown доходят, а другие вряд ли кому нужны
и имеено глобально: например я это это использовал для регулировки
громкости своего плеера и захвата экрана во время Direct3D и OpenGL игр
а если нужно обработать и передать дальше так вы и сами знаете как
и можете не считать это глобальным хуком, но это работает
и пора бы и вам предложить свое решение без dll


 
begin...end ©   (2006-06-22 22:23) [21]

> programania ©   (22.06.06 21:39) [20]

> Могу

Тогда приведите его, пожалуйста. Причём именно такое решение, в котором ловушка устанавливается функцией RegisterHotKey. И решение именно задачи, поставленной в [19], а не какой-либо другой.

> и хотя не уверен насчет всех сообщений,
> но те что получает FormKeyDown доходят

Это плохо. Если Ваша "ловушка" заведомо будет получать НЕ ВСЕ сообщения, а только те, которые посылаются одному-единственному окну, то это уже будет совсем НЕ ГЛОБАЛЬНАЯ ловушка.

> и пора бы и вам предложить свое решение без dll

Что ж, пожалуй, действительно, пора. Собственно, направление для поиска я дал ещё в [6]. А конкретный код может быть таким:

type
 TTestForm = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   Hook: HHOOK;
 end;

var
 TestForm: TTestForm;

function HookProc(nCode, wParam, lParam: Integer): LRESULT; stdcall;
type
 PKBDLLHookStruct = ^TKBDLLHookStruct;
 TKBDLLHookStruct = packed record
   vkCode, scanCode, flags, time: Cardinal;
   dwExtraInfo: PCardinal;
 end;
const
 MsgNames: array [0..4] of string =
   ("UNKNOWN", "WM_KEYDOWN", "WM_KEYUP", "WM_SYSKEYDOWN", "WM_SYSKEYUP");
var
 I: Integer;
begin
 if nCode = HC_ACTION then
 begin
   case WParam of
     WM_KEYDOWN:     I := 1;
     WM_KEYUP:       I := 2;
     WM_SYSKEYDOWN:  I := 3;
     WM_SYSKEYUP:    I := 4;
   else
     I := 0
   end;
   with PKBDLLHookStruct(lParam)^ do
     TestForm.Caption := Format("Message: %s  Virtual code: %d  Scan code: %d", [MsgNames[I], vkCode, scanCode])
 end;
 Result := CallNextHookEx(0, nCode, wParam, lParam)
end;

procedure TTestForm.FormCreate(Sender: TObject);
const
 WH_KEYBOARD_LL = 13;
begin
 Hook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0)
end;

procedure TTestForm.FormDestroy(Sender: TObject);
begin
 UnhookWindowsHookEx(Hook)
end;


P.S. Всё же не теряю надежды на то, что увижу Ваше решение.


 
Leonid Troyanovsky ©   (2006-06-22 22:32) [22]


> programania ©   (22.06.06 21:39) [20]

> и можете не считать это глобальным хуком, но это работает


А можно мы будем звать оное по-старинке, т.е. aka hot key?
Заранее благодарны.


> и пора бы и вам предложить свое решение без dll


И почему, собс-но, пора?
Хотя, все уже украдено до нас: http://www.msdn.microsoft.com

--
Regards, LVT.


 
ANB ©   (2006-06-23 09:26) [23]

Глобальные низкоуровневые хуки на клавиатуру и мышу можно ставить прямо из своего экзешника. Пример есть MSDN, а подробности можно почитать в Рихтере (хорошо, что он есть на русском).


 
Игорь Шевченко ©   (2006-06-23 09:53) [24]


> я думаю что создав SetWindowsHookEX ее создатели ужаснулись
> делу рук своих и решили что американский человек никогда
> этого не поймет и
> поэтому для самого типового использования ловушек и создали
> RegisterHotKey
> спрятав все хуки внутрь что вас и смутило


Дорогой друг, убедительная просьба рассказывать подобные сказки в другой аудитории. Совет такой добрый.


 
Rouse_ ©   (2006-06-23 13:37) [25]

Нет, вы погодите, я все-же хочу увидеть это чудо:

> Могу,
> причем именно до того, как они попадут в целевые оконные
> процедуры
> и хотя не уверен насчет всех сообщений,

Дерзай programania :)


 
programania ©   (2006-06-23 19:44) [26]

> begin...end ©   (22.06.06 22:23) [21]

Спасибо за пример
Лучше бы его привести сразу в [6] раз это так просто
ведь не все понимают ваши намеки
тем более что WH_KEYBOARD_LL у меня в D5 нет и
видно вы описали ее только чтоб оправдать свой намек

>Тогда приведите его, пожалуйста

так я уже привел все что мог и обьяснил что
это вполне подходит для типовых случаев

>Если Ваша "ловушка" заведомо будет получать НЕ ВСЕ сообщения,
>а только те, которые посылаются одному-единственному окну,
>то это уже будет совсем НЕ ГЛОБАЛЬНАЯ ловушка.

так и в вашем примере все сообщения получает одно окно TestForm
и уже потом посылает другим - CallNextHookEx
а у меня - SendMessage(GetForegroundWindow

>Игорь Шевченко ©   (23.06.06 09:53) [24]
>Дорогой друг, убедительная просьба рассказывать подобные сказки в другой аудитории.

Спасибо за совет Дорогой друг, я думал это форум для всех
И как же в вашей аудитории обьясняют наличие функции RegisterHotKey,
дублирующей SetWindowsHookEX,  наверно так: "пути господни неисповедимы"

>Rouse_ ©   (23.06.06 13:37) [25]

Похоже кроме меня никто не использовал RegisterHotKey
так повторяю: назначенные клавиши вообще никогда не попадут
в целевые оконные процедуры активного окна ни до ни после
кто не верит может испытать программу по ссылке в [7]
и нет тут никакого чуда
просто все сделано для удобства решения типовой задачи


 
Rouse_ ©   (2006-06-23 19:52) [27]


> Похоже кроме меня никто не использовал RegisterHotKey
> так повторяю: назначенные клавиши вообще никогда не попадут
> в целевые оконные процедуры активного окна ни до ни после
> кто не верит может испытать программу по ссылке в [7]
> и нет тут никакого чуда
> просто все сделано для удобства решения типовой задачи

Молодой человек, вы не поторопились?
Давайте я переопределю задачу, поставленную begin...end чтобы вы четко поняли сам механизм.
Задача звучит так: При запуске нашей програмы предотвратить ввод данных в окно любого приложения до тех пор, пока не будет набранна комбинация "qwe" без кавычек в этом окне.

Вперед любезный...

Желаю успехов...


 
Leonid Troyanovsky ©   (2006-06-23 19:53) [28]


> programania ©   (23.06.06 19:44) [26]

> тем более что WH_KEYBOARD_LL у меня в D5 нет и


Дык, оно есть в NT4SP3+, о чем уж, вроде, говорилось.
Дельфи тут вовсе ни причем.

--
Regards, LVT.


 
Игорь Шевченко ©   (2006-06-23 19:57) [29]


> И как же в вашей аудитории обьясняют наличие функции RegisterHotKey,
>
> дублирующей SetWindowsHookEX,  наверно так: "пути господни
> неисповедимы"


функция registerhotkey никоим образом не дублирует SetWindowsHookEx. Давайте так договоримся, вы немножко матчасть подучите, а потом мы с вами с удовольствием подискутируем. Просто в дискуссии хотелось бы рассчитывать на определенный уровень грамотности собеседника...

С наилучшими,


 
begin...end ©   (2006-06-23 20:45) [30]

> programania ©   (23.06.06 19:44) [26]

> Спасибо за пример
> Лучше бы его привести сразу в [6] раз это так просто
> ведь не все понимают ваши намеки

За пример -- пожалуйста. Однако право решать, когда МНЕ приводить СВОИ примеры (которых я никому не обещал), оставьте, пожалуйста, за МНОЙ. И мой "намёк" в [6] был вполне конкретен: поиск в MSDN по указанному ключевому слову даёт хорошие результаты, в которых остаётся лишь вдумчиво разобраться.

> тем более что WH_KEYBOARD_LL у меня в D5 нет

Вы будете смеяться, но у меня в D7 его тоже нет. Что, однако, не помешало мне написать рабочий пример. Ибо дело, как уже замечено в [28], совсем не в Delphi.

> видно вы описали ее только чтоб оправдать свой намек

Я описал эту константу для того, чтобы написать рабочий пример в виде нормально читаемого кода. Если Вы считаете, что я, приводя пример, перед кем-то оправдывался, то это Ваши проблемы.

> так и в вашем примере все сообщения получает одно окно TestForm

В моём примере ВСЕ сообщения WM_KEYDOWN (предназначенные ЛЮБОМУ из потоков в системе) получает функция ловушки HookProc (на то она, ловушка, и ГЛОБАЛЬНАЯ). Потом эти  сообщения уходят туда, куда они изначально направлялись -- в данном случае функция хука этому не мешает. А форма TestForm в примере используется лишь для демонстрации результата, и её можно было вообще выкинуть из кода -- сама ловушка от этого не стала бы работать хуже.

> так я уже привел все что мог и обьяснил что
> это вполне подходит для типовых случаев

Э... нет, уважаемый, так дело не пойдёт. Я в [19] сформулировал КОНКРЕТНУЮ задачу? Сформулировал. Вы в [20] сказали, что МОЖЕТЕ решить эту КОНКРЕТНУЮ задачу функцией RegisterHotKey? Сказали.

Однако пока что Вашего решения я не увидел. В чём же дело?

Поскольку у нас в форуме за свои слова принято отвечать (см. правила), повторю свою просьбу в N-й раз: приведите, пожалуйста, решение этой конкретной задачи (которая представляет собой установку глобального хука) своим способом, тем самым подтвердив своё заявление о том, что функцию RegisterHotKey можно использовать для установки этого самого глобального хука. Или, если у Вас нет решения и Вы не можете его написать, извинитесь перед автором темы.

> и уже потом посылает другим - CallNextHookEx

Функция CallNextHookEx никаким окнам (в том числе и "другим") никаких сообщений не посылает. Похоже, следует прислушаться к [29].

Жду ответа. Желательно в виде рабочего кода (причём по теме), а не слов (причём не по теме).


 
programania ©   (2006-06-24 02:43) [31]

>Rouse_ ©   (23.06.06 19:52) [27]
>Вперед любезный...
>begin...end ©   (23.06.06 20:45) [30]
>Жду ответа. Желательно в виде рабочего кода (причём по теме).

Я могу только повторить что уже писал [18]
RegisterHotKey не так универсальна как SetWindowsHookEX
и конечно можно придумать разные каверзные случаи
неподходящие для нее однако для типового применения
она вполне заменит SetWindowsHookEX для чего и предназначена
что я и предложил поскольку ничего лучше тогда еще никто не предложил
хотя и мог как оказалось и только благодаря моему упорству
удалось получить информацию полезную многим
в доступном всем виде и это главная цель форума
а все остальное никто и читать не будет


 
begin...end ©   (2006-06-24 08:25) [32]

> programania ©   (24.06.06 02:43) [31]

> Я могу только повторить что уже писал [18]

А я могу повторить то, что Вы писали в [20]: "Могу". Вы утверждали, что можете решить [19]. Так можете, или нет? Если да, приведите решение. Если нет, извинитесь. Кажется, это я уже говорил...

> конечно можно придумать разные каверзные случаи
> неподходящие для нее

В задаче [19] нет ничего каверзного. Эта задача -- типичная для применения хуков. И Вы сами с этим согласились в [18]. А если RegisterHotKey не решает даже типичных задач из этой области -- вероятно, она предназначена для чего-то другого, не правда ли?

> однако для типового применения
> она вполне заменит SetWindowsHookEX

См. выше -- [19] представляет собой типовую задачу. Однако код, решающий её с помощью SetWindowsHookEx, уже есть (см. [21]), а кода, решаающего её функцией RegisterHotKey (которая, по Вашим словам, для типовых задач вполне заменяет SetWindowsHookEx), Вы пока почему-то не привели. Так за чем же дело стало?

> что я и предложил поскольку ничего лучше тогда еще никто
> не предложил

Вы невнимательно читаете. [6] было предложено ещё до того, как Вы появились в этой ветке.

> хотя и мог как оказалось и только благодаря моему упорству
> удалось получить информацию полезную многим

LOL.

> и это главная цель форума
> а все остальное никто и читать не будет

Давайте, всё-таки, поменьше слов и побольше дела. Либо код, либо извинения.


 
programania ©   (2006-06-24 19:28) [33]

begin...end ©   (24.06.06 08:25) [32]
>Rouse_ ©   (23.06.06 19:52) [27]
> При запуске нашей програмы предотвратить ввод данных в окно любого приложения
> до тех пор, пока не будет набранна комбинация "qwe" без кавычек в этом окне.

Извините все, но при помощи RegisterHotKey эту задачу решить не могу
да и не обещал решать любые задачи
однако может намекнете как при помощи SetWindowsHookEX
предотвратить ввод ctrl+alt+del в любом окне
после чего нашу программу можно снять мышью


 
begin...end ©   (2006-06-24 19:32) [34]

> programania ©   (24.06.06 19:28) [33]

> Извините все, но при помощи RegisterHotKey эту задачу решить
> не могу

Наконец-то. Непонятно, правда, зачем в [20] нужно было говорить обратное, ну да ладно.

> однако может намекнете...

Нет, не намекну.


 
Юрий Зотов ©   (2006-06-25 12:02) [35]

> begin...end

Наслаждался...
:о)


 
programania ©   (2006-06-25 19:03) [36]

>begin...end ©   (20.06.06 21:53) [34]
>Непонятно, правда, зачем в [20] нужно было говорить обратное

в [20] я как раз и намекал на этот случай
"и хотя не уверен насчет всех сообщений,"
так оно и случилось, RegisterHotKey не устанавливается на ctrl+alt+del

>Нет, не намекну

Непонятно, правда, зачем в [10] нужно было говорить обратное, ну да ладно.

"если нужно, изменять параметры этих сообщений до того,
как они будут попадать в соответствующие оконные процедуры ...
Причём хочу отслеживать сообщения, отправляемые любому из потоков в системе."


 
Игорь Шевченко ©   (2006-06-26 10:46) [37]


> так оно и случилось, RegisterHotKey не устанавливается на
> ctrl+alt+del


Устанавливается. Только не всеми...


 
begin...end ©   (2006-06-26 13:13) [38]

> Юрий Зотов ©   (25.06.06 12:02) [35]

Чем?

> programania ©   (25.06.06 19:03) [36]

> Непонятно, правда, зачем в [10] нужно было говорить обратное,
> ну да ладно.

В [10] я не говорил обратного. А именно, я не обещал намекнуть Вам, как заблокировать CAD. Поэтому рекомендую Вам забрать свои слова обратно, пока не пришлось извиняться снова.


 
programania ©   (2006-06-26 19:33) [39]

>begin...end ©   (26.06.06 13:13) [38]
>я не обещал намекнуть Вам, как заблокировать CAD.

так я нигде и не говорил что обещали,
я имел в виду любые сообщения от клавиатуры о которых Вы сказали достаточно
если CAD не то же самое, то извините

кстати, Ваш пример в W98 вообще ничего не ловит
а мой работает нормально

>Юрий Зотов ©   (25.06.06 12:02) [35]
>Наслаждался...

Вот специально обучил своего бота отвечать на вопросы
о delphi, программах и т.п. как тут это принято
спрашивайте и наслаждайтесь
http://programania.com/pi
жду новых забавных ответов, подходящих к любому вопросу


 
begin...end ©   (2006-06-26 20:13) [40]

> programania ©   (26.06.06 19:33) [39]

Мой пример ничего не блокирует, а только показывает, как можно посмотреть на интересующие сообщения до того, как они попадут в оконные процедуры. В том числе, и на сообщения от клавиш Ctrl, Alt и Del (даже нажатых вместе).

> кстати, Ваш пример в W98 вообще ничего не ловит

Совершенно верно -- мой пример не работает в Win98. Надеюсь, что ни для кого из читающих ветку, кроме Вас, это новостью не является, ведь я сам сказал об этом ещё в [6].

> а мой работает нормально

Совершенно верно -- Ваш пример работает в Win98. Правда, к теме ветки он не имеет ни малейшего отношения.

LOL.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.046 c
2-1171893830
vitv
2007-02-19 17:03
2007.03.11
Dbgrid+DBLookupComboBox1


8-1147019307
Константинов
2006-05-07 20:28
2007.03.11
WaveOut


2-1171908960
Ezorcist
2007-02-19 21:16
2007.03.11
C:Array of Char S:string


15-1171440220
ANB
2007-02-14 11:03
2007.03.11
Чет мне это сильно напоминает :)


15-1171150185
Макрос
2007-02-11 02:29
2007.03.11
А я знаю простую задачу которую без макросов очень сложно сделать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский