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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2014, 11:01   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Хук на WH_CALLWNDPROC, сообщение WM_Paste

Пытаюсь отловить сообщение WM_Paste, WM_Copy, но нечего не выходит, процедура для отлова глобальная, вот сообственно и она:
Код:
function HookPaste(code: integer; wParam: word; lParam: longint) : longint; stdcall;
var
  fileDir:string;
Begin
  if code < 0 then
    Result:= CallNextHookEx(CurHook, Code, wParam, lParam)
  else begin
           FileDir:='c:\log.txt';
          AssignFile(f, Filedir);
          if not FileExists(FileDir) then begin
            Rewrite(f);
            CloseFile(f);
          end;
          if TMsg(Pointer(lParam)^).message = WM_Copy then begin
            Append(f);
            Writeln(f, TMsg(Pointer(lParam)^).message);
            CloseFile(f);
          end;
          {SendMessage(Wnd,HookMsg,wParam, GetCurrentThreadId);}
          Result:=CallNextHookEx(CurHook, Code, wParam, lParam);
  end;
end;
Не ловит сообщение при копировании или вставки в окно, в логе FileDir пусто, но почему? Хук устанавливается нормально, если убрать условие
Код:
  if TMsg(Pointer(lParam)^).message = WM_Copy then begin
То все сообщение пишутся в лог.
Winexcel вне форума Ответить с цитированием
Старый 15.07.2014, 11:19   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

WM_Copy и WM_Paste по идее должны работать для текста или картинок, но не файлов. Файлы в буфере обмена Проводника находятся по другому.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 15.07.2014, 11:22   #3
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
WM_Copy и WM_Paste по идее должны работать для текста или картинок, но не файлов. Файлы в буфере обмена Проводника находятся по другому.
Здравствуйте! Только что читал вашу тему на форуме, сделал по аналогии =) копирую я текст именно. Например из текстового документа.
Winexcel вне форума Ответить с цитированием
Старый 15.07.2014, 19:01   #4
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Немного переделал код по msdn:
Код:
var
  VStruct : PCWPSTRUCT;
  VMess : Cardinal;
  f:TextFile;
  FileDir:String;
begin
  Result := 0;
  //
  if (Code < 0) then
    Result:=CallNextHookEx(CurHook, Code, wParam, lParam)
  else
  if (Code = HC_ACTION) then
   begin
    VStruct := PCWPSTRUCT(Pointer(lParam));
    VMess := VStruct.message;
      //
          FileDir:='c:\log.txt';
          AssignFile(f, Filedir);
           Append(f);
          Writeln(f, 'MSG Lparam = ',VMess);
          Writeln(f, 'Lparam = ',lParam);
          Writeln(f, 'Wparam = ',WParam);
          CloseFile(f);
       end;
      //
end;
Но результатов это не дало, в текстовом документе примерно такое содержание:
Код:
MSG Lparam = 1633676
Lparam = 1633524
Wparam = 0
MSG Lparam = 1633656
Lparam = 1633532
Wparam = 0
MSG Lparam = 1633676
Lparam = 1633524
Wparam = 0
MSG Lparam = 8716519
Lparam = 1633600
Wparam = 0
MSG Lparam = 30278158
Lparam = 1633600
Wparam = 0
MSG Lparam = 0
Lparam = 1634248
Wparam = 0
MSG Lparam = 1633676
Lparam = 1633524
Wparam = 0
MSG Lparam = 1633656
Lparam = 1633532
Wparam = 0
MSG Lparam = 1633676
Lparam = 1633524
Wparam = 0
MSG Lparam = 1704024
Lparam = 1633600
Wparam = 0
Исходный результат в переменной lparam, пробовал переводить в 0x результатов не дало, или я уже не туда пошёл совсем? Ибо цифры в мессадже как-то подозрительно выглядят.

Последний раз редактировалось Winexcel; 15.07.2014 в 19:04.
Winexcel вне форума Ответить с цитированием
Старый 15.07.2014, 20:19   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сообщения не содержат в себе данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.07.2014, 20:26   #6
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
сообщения не содержат в себе данных.
Мне нужно не данные перехватить, а само сообщение, с успехом смог перехватить WM_CLOSE
Код:
var
  VStruct : PCWPSTRUCT;
  VMess : Cardinal;
  f:TextFile;
  FileDir:String;
begin
  Result := 0;
  //
  if (Code < 0) then
    Result:=CallNextHookEx(CurHook, Code, wParam, lParam)
  else
  if (Code = HC_ACTION) then
   begin
    VStruct := @lParam;
    VMess := VStruct.message;
      //
      case VMess of
        WM_CLOSE: begin
                    FileDir:='c:\log.txt';
                    AssignFile(f, Filedir);
                     Append(f);
                    Writeln(f, 'MSG Lparam = ',VMess );
                    Writeln(f, 'Lparam = ',lParam);
                    Writeln(f, 'Wparam = ',WParam);
                    CloseFile(f);
                  end;
      end;
    end;
end;
Но не WM_COPY, WM_Paste, WM_Cut, и прочее перехватывать не как не хочет
Кто знает прошу помощи.

Последний раз редактировалось Winexcel; 15.07.2014 в 20:49.
Winexcel вне форума Ответить с цитированием
Старый 16.07.2014, 11:47   #7
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Строка из поста #4
Код:
VStruct := PCWPSTRUCT(Pointer(lParam));
и из поста #6
Код:
VStruct := @lParam;
не одно и тоже.
Это просто фантастика, что Вам таким образом удалось отловить WM_CLOSE!
Silver_S вне форума Ответить с цитированием
Старый 16.07.2014, 11:50   #8
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Silver_S Посмотреть сообщение
Строка из поста #4
Код:
VStruct := PCWPSTRUCT(Pointer(lParam));
и из поста #6
Код:
VStruct := @lParam;
не одно и тоже.
Это просто фантастика, что Вам таким образом удалось отловить WM_CLOSE!
Нет нечего не возможного , работает же
Winexcel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SetWindowsHookEx + WH_CALLWNDPROC в C# Rishi Win Api 1 06.07.2013 22:06
Отлавливать сообщение WM_PASTE ololo23 Помощь студентам 4 16.03.2013 16:43
Может ли SetWindowsHookEx(WH_CALLWNDPROC) повесить всю систему? SergeyEfimov Win Api 4 26.02.2011 02:01
Как отловить событие wm_paste? Romanych007 Помощь студентам 1 10.07.2010 20:42
WH_CALLWNDPROC, расширение Системных часов TGrey[WoLf] Win Api 0 25.06.2010 16:00