Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 22:13   #1
Ragnarek45
Пользователь
 
Регистрация: 04.12.2010
Сообщений: 14
По умолчанию Не выполняется условие

Код:
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
     f:TextFile;
     cursor:tpoint;
     hand:hwnd;
     reload:HWND;
    add:HWND;
     begin
  if code = HC_ACTION then
    begin
      if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
        begin
          app:=GetForegroundWindow();
          reload:=FindWindowEx(app,0,nil,'Обновить') ;
          add:=FindWindowEx(app,0,nil,'Добавить');
          getcursorpos(cursor);
          hand:=WindowFromPoint(cursor);
          if (reload<>0)and(reload=hand)and(start=false)  then
          begin
          EnumChildWindows(app, @childwindows,0);
          start:=true;
          end;
          if (add<>0)and(add=hand) then
          begin
          SetLength(t, SendMessage(d5, wm_gettextlength, 0, 0));
          SendMessage(d5, wm_gettext, Length(t)+1, Integer(t));
          messagebox(0,pwchar(t),'asdadasd',0);
          AssignFile(F, 'C:\1.txt');
          if FileExists('C:\1.txt') then
          Append(f) else Rewrite(f);
          WriteLn(F,t);
          CloseFile(F);
          end;
          end;
       end;
     Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;
Не могу понять в чем причина...первое условие нормально выполняется..а второе не хочет ни в какую=(
Ragnarek45 вне форума Ответить с цитированием
Старый 07.12.2010, 23:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где start и где она инициализируется/изменяется?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.12.2010, 23:32   #3
Ragnarek45
Пользователь
 
Регистрация: 04.12.2010
Сообщений: 14
По умолчанию

объявляется в глобальных переменных) а изменяется только один раз на тру
Ragnarek45 вне форума Ответить с цитированием
Старый 10.12.2010, 15:08   #4
Ragnarek45
Пользователь
 
Регистрация: 04.12.2010
Сообщений: 14
По умолчанию

Код:
library hook_1;

uses
  Windows,
  Messages,sysutils,
  Forms;

const
  MMFName: PChar = 'MyMMF'; // имя объекта файлового отображения

{структура, поля которой будут отображены в файл подкачки}
type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
    SysHook: HWND; // дескриптор установленной ловушки
  end;

var
  GlobalData: PGlobalDLLData;
  MMFHandle: THandle;
  d5:hwnd;
  app:hwnd;
  hand:hwnd;
  t:string;


function checkhandle(handlapp:HWND; posic:TPoint):integer;stdcall;
var
exitt:hwnd;
reload:HWND;
addd:HWND;
begin
result:=0;
reload:=FindWindowEx(app,0,nil,'Обновить') ;  //хэндл кнопки Обновить
addd:=FindWindowEx(app,0,nil,'Добавить');   //хэндл кнопки
exitt:=FindWindowEx(app,0,nil,'Выход');
hand:=WindowFromPoint(posic);
if reload=hand then result:=1;
if addd=hand then result:=2;
if exitt=hand then result:=3;
end;

function childwindows(handl:HWND):bool; stdcall;
Begin
result:=true;
d5:=FindWindowEx(handl,0,nil,'1248');  //ищем поле с именем 1248
if d5<>0 then
begin
  result:=false;
  messagebox(0,'','',0);
  end
  else exit;
 end;

{Данная ф-ия вызывается системой каждый раз, когда возникает какое-то событие в
dialog box-е, message box-е, menu, или scroll bar-е}
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
     f:TextFile;
     jaja:integer;
    start:bool;
     cursor:tpoint;
     begin
  if code = HC_ACTION then
    begin
      if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then    //нажимается левая кнопка
        begin
          app:=GetForegroundWindow();       //хэндл активного окна
          getcursorpos(cursor);                    //получаем положение курсора
          jaja:=checkhandle(app,cursor);
         case jaja of
         1:
         begin
          EnumChildWindows(app, @childwindows,0); //функция
          start:=true;
          end;
         2:
          begin
          SetLength(t, SendMessage(d5, wm_gettextlength, 0, 0)); // получаем текст
          SendMessage(d5, wm_gettext, Length(t)+1, Integer(t));  // из требуемого поля
          messagebox(0,pchar(t),'trt',0);
          AssignFile(f, 'C:\1.txt');           //записываем в файл
          if FileExists('C:\1.txt') then
          Append(f) else Rewrite(f);
          WriteLn(f,t);
          CloseFile(f);
          end;
         3:start:=false;
          end;
        end;
    end;
  {Пытаемся передать сообщение дальше по цепочке hook-ов. }
  Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
  if switch=true then
  begin
    {Устанавливаю HOOK, если он не установлен (switch=true). }
    GlobalData^.SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
   end
  else
    UnhookWindowsHookEx(GlobalData^.SysHook)
  end;


procedure OpenGlobalData();
begin
  {получаем объект файлового отображения}
//  MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // можно так, но лучше: см. след. строку
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);

  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then      CloseHandle(MMFHandle);

end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenGlobalData;
    DLL_PROCESS_DETACH: CloseGlobalData;
  end;
end;

exports hook;

begin
//MessageBox(0, PChar(Application.ExeName), 'Message from Exampel1/Process1', 0);
  {назначим поцедуру переменной DLLProc}
  DLLProc:= @DLLEntryPoint;
  {вызываем назначенную процедуру для отражения факта присоединения данной
   библиотеки к процессу}
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Вот весь код...если нажать на кнопку обновить а потом добавить...то ничего собственно говоря не происходит. Видимо выполнение программы где то зацикливается и не доходит до case 2 =( помогите
Ragnarek45 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не выполняется условие Link12 Общие вопросы C/C++ 6 30.03.2010 19:36
не выполняется второе условие if Division Общие вопросы C/C++ 5 24.12.2008 03:16
Найти первый из номеров K, для которых выполняется условие |AK AK–1| < D Jereme Паскаль, Turbo Pascal, PascalABC.NET 2 21.12.2008 12:54
Почему выполняется ложное условие? AND Помощь студентам 8 16.11.2007 16:30