Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.12.2011, 15:23
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию "Блокировка" мыши

Привет форумчане

Нужная программа находится функцией FindWindow. Как можно блокировать нажатие (правой) кнопки мыши именно для этой программы (окна)?
Ответить с цитированием
  #2  
Старый 24.12.2011, 16:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Я бы делал через Hook. На этом форуме или в гугле полно примеров.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 25.12.2011, 10:40
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest, а можно в примерах объяснить?
Ответить с цитированием
  #4  
Старый 25.12.2011, 19:15
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Для этого есть специальные места. Просто мне писать трактаты по полному описанию нет смысла, тем более за меня это уже сделали.
Главный тык
Тык 2
Тык 3
И т.д.
И на delphisources было не раз:
Тык 4
Тык 5
Только не советую "тупо копипастить".
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.12.2011 в 19:19.
Ответить с цитированием
  #5  
Старый 27.12.2011, 10:04
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest, по книге "Delphi-Глазами хакера" нашел готовый код и изменил его для Калькулятора (результат: в калькуляторе не должна "нажиматься" правая кнопка мыши) так:

PHP код:
var
  
Form1TForm1;
  
wndHWND;
  
bBoolean;

  
procedure RunStopHook(State BooleanWndHWNDstdcall;
  
external 'hackpass.dll' index 1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(SenderTObject);
begin
wnd
:=FindWindow(nil'Calculator');
if 
wnd<>0 then
 begin
  b
:=True;
  
RunStopHook(Truewnd);
  
ShowMessage('Find');
 
end;
end;

procedure TForm1.FormClose(SenderTObject; var ActionTCloseAction);
begin
if b then RunStopHook(Falsewnd);
end;

end

Вот сама библиотека:

PHP код:
library hackpass;

uses WindowsMessages;
var
 
SysHook HHook 0;
 
Wnd Hwnd 0;
 
hd  HWND 0;

function 
SysMsgProc(code integerwParam word;
lParam longint) : longintstdcall;
begin
 CallNextHookEx
(SysHookCodewParamlParam);
 if 
code HC_ACTION then
  begin
   Wnd 
:= TMsg(Pointer(lParam)^).hwnd;
   if (
TMsg (Pointer (lParam)^).message WM_RBUTTONDOWN) and (Wnd=hdthen
    SendMessage
(WndWM_CANCELMODE00);
    
//НО ВСЕ ТАКИ КОНТЕКСТНОЕ МЕНЮ ОТОБРАЖАЕТСЯ
  
end;
end;

procedure RunStopHook(StateBooleanhHWNDexportstdcall;
begin
if State=true then
 begin
  hd
:=h;
  
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProcHInstance0);
 
end else
 
begin
  UnhookWindowsHookEx
(SysHook) ;
  
SysHook := 0;
 
end;
end;

exports RunStopHook index 1;
begin
end


НО ВСЕ ТАКИ КОНТЕКСТНОЕ МЕНЮ ОТОБРАЖАЕТСЯ, как можно блокировать это?
Ответить с цитированием
  #6  
Старый 27.12.2011, 16:29
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Я бы сделал иначе. Если окно под мышью - калькулятор, то НЕ вызываем следующий хук (callNextHookEx), иначе вызываем.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 27.12.2011, 17:58
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest я исправил код на следующее:

PHP код:
function SysMsgProc(code integerwParam word;
lParam longint) : longintstdcall;
begin
if code HC_ACTION then
 begin
  Wnd 
:= TMsg(Pointer(lParam)^).hwnd;

  if 
GetParent(Wnd)=hd then
   begin
    
if TMsg (Pointer (lParam)^).message WM_RBUTTONUP then
     SendMessage
(WndWM_CANCELMODE00);
   
end else
   
begin
    CallNextHookEx
(SysHookCodewParamlParam);
   
end
 
end;
end

но все равно не помогло, в этом случае я даже не смог кликать в других окнах, как бы мышь не работает.
И еще одно, оказывается:
PHP код:
if TMsg (Pointer (lParam)^).message WM_RBUTTONUP then
 SendMessage
(WndWM_CANCELMODE00); 
вообще не предотвращает контекст меню (т.е.)

Пожалуйста, подскажите как быть?
Ответить с цитированием
  #8  
Старый 27.12.2011, 18:16
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; 
begin 
if code = HC_ACTION then 
 begin 
  Wnd := TMsg(Pointer(lParam)^).hwnd; 

  if (Wnd=hd)or(GetParent(Wnd)=hd) then 
    result:=1
  else 
    result:=CallNextHookEx(SysHook, Code, wParam, lParam);
 end; 
end;  
Думаю, как-то так.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 27.12.2011, 18:32
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest на вашем листинге нету же кода "блокировки" правой кнопки мыши
Ответить с цитированием
  #10  
Старый 27.12.2011, 18:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Зато там есть остановка цепочки хуков. Я же писал выше: не советую просто копировать код, лучше разберитесь. В моей программе аналогичный код, работает, как часы.
А, ну да. Естественно надо еще сделать проверку, что это именно правая кнопка мыши, и для других кнопок использовать всё тот же CallNextHookEx.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 27.12.2011 в 18:51.
Ответить с цитированием
  #11  
Старый 28.12.2011, 12:37
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest, удалось определить нужное окно при нажатии правой кнопки мыши. Осталось блокировать контекст меню...Поискал, прочитал много стаей, в одном из них написали что достигли это с помощью EndMenu.
Но увы и это мне не помогло.
Вот библиотека:

PHP код:
library hackpass;

uses
  Windows
,
  
Messages,
  
ShellAPI;

var
 
SysHookHHook 0;
 
WndHwnd 0;

function 
SysMsgProc(codeintegerwParamwordlParamlongint): longintstdcall;
var 
buff : array[0.127of Char;
    
tsString;
begin
if code HC_ACTION then
 begin
  
if TMsg(Pointer (lParam)^).message WM_RBUTTONDOWN then
   begin
    Wnd 
:= TMsg(Pointer(lParam)^).hwnd;
    
GetClassName(Wndbuffsizeof(buff));
    
ts:=buff;
    if 
ts='ИМЯ КЛАССА НУЖНОГО ОКНА (ИЗВЕСТНО)' then
     begin
      MessageBox
(0,'Success','',MB_OK);
      
EndMenu;
     
end;
   
end else
    
Result:=CallNextHookEx(SysHookCodewParamlParam);
 
end;
end;

procedure RunStopHook(StateBooleanexportstdcall;
begin
if State=true then
 begin
  SysHook 
:= SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProcHInstance0);
 
end else
 
begin
  UnhookWindowsHookEx
(SysHook) ;
  
SysHook := 0;
 
end;
end;

exports RunStopHook index 1;
begin
end


Что посоветуете?
Ответить с цитированием
  #12  
Старый 28.12.2011, 16:53
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Я же не спроста написал выше:
Код:
result:=1;
Я в хуках не сильно разбираюсь, но насколько я знаю, возврат нуля винда будет расценивать как "все ок, продолжаем работу" и сама передаст управление следующему хуку. Возврат же другого числа винда посчитает ошибкой, и цепь ловушек прервется, сообщение будет остановлено. Так что нужно там, где идет блок, результату присвоить значение, отличное от нуля. Тогда нажатие правой кнопки мыши так и не доберется до калькулятора.
А вот всякие ухищрения вроде попыток убрать меню и пр. бесполезны - хук обрабатывается до того, как сообщение о нажатии кнопки мыши дойдет до окна калькулятора, а значит до того, как это меню отобразится.
[лирическое отступление] Вообще убрать уже открывшееся меню может быть крайне трудной задачей - например, ничто не мешает по нажатию правой кнопки мыши просто-напросто нарисовать белый прямоугольник с текстом в нем, и при движении мыши подсвечивать разные строки. И отловить такое "открытие меню" будет почти невозможно, не говоря уже о том, чтобы стереть это "меню" и восстановить предыдущее изображение, да вдобавок отключить обработчики движения мыши над картинкой. Так что лучше сделать так, чтобы сообщение о ПКМ просто не добиралась до интересующего окна.[/лирическое отступление]
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 28.12.2011 в 17:00.
Ответить с цитированием
  #13  
Старый 29.12.2011, 09:23
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Bargest, слава Богу, решение найдено, вот отрывок из библиотеки:

PHP код:
function SysMsgProc(codeintegerwParamwordlParamlongint): longintstdcall;
var 
buff : array[0.127of Char;
    
tsString;
    
//t: PChar;
begin
if code HC_ACTION then
 begin
  
if TMsg(Pointer (lParam)^).message WM_RBUTTONDOWN then
   begin
    Wnd 
:= TMsg(Pointer(lParam)^).hwnd;
    
GetClassName(Wndbuffsizeof(buff));
    
ts:=buff;
    if 
ts='ИМЯ КЛАССА (ИЗВЕСТНО)' then
     begin
      MessageBox
(0,'Success','',MB_OK);
      
TMsg(Pointer(lParam)^).message:=WM_NULL;
      
Result:=CallNextHookEx(SysHookCodewParamlParam);
     
end else
     
begin
      Result
:=CallNextHookEx(SysHookCodewParamlParam);
     
end;
   
end else
    
Result:=CallNextHookEx(SysHookCodewParamlParam);
 
end else
 
begin
  Result
:=CallNextHookEx(SysHookCodewParamlParam);
 
end;
end

Спасибо вам за внимание и за поддержку.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter