Форум: "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