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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.05.2008, 13:07   #1
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию Скроллинг в Word как в pdf

Задача стоит такая:
Когда я зажимаю ЛКМ и веду по документу мышью, должны производиться теже действия, что и в pdf-ках.
Придумал такое дело:
Ловить хуком движение мишки и зажатие левой клавиши мыши, использую WH_Mouse_LL:

Код:
function MouseLLHookProc(Code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;
var
    ms : MSLLHOOKSTRUCT;
begin
if (Code = HC_ACTION) then
    begin
     if wparam=wm_lbuttondown then
        begin
          ms := PMSLLHOOKSTRUCT(lParam)^;
                 z:=ms.pt.Y;
        end;
    if wparam=Wm_mousemove then
        begin
       if GetAsyncKeyState(vk_lbutton)<>0 then begin
         ms := PMSLLHOOKSTRUCT(lParam)^;
         x1:=ms.pt.x;
         y1:=ms.pt.Y;
             end;
        end;
    end;
    Result:=CallNextHookEx(myhook,Code,wParam,lParam);
end;
Реализация скроллинга будет такая (скроллинг вверх/вниз):


Код:
down:='1';
if y1<z
 then
   wordapplication1.ActiveWindow.ActivePane.SmallScroll(down,emptyparam,emptyparam,emptyparam)
 else 
   wordapplication1.ActiveWindow.ActivePane.SmallScroll(emptyparam,down,emptyparam,emptyparam);
У меня проблема с связыванием всего этого. В самой функции хука нельзя использовать Wordapplication1. Если в функции в
var обьявить WordApplication1:TWordApplication, то приложение компилируеться, но при запуске хука выдает ошибку типа:

Помогите решить это!
Если сделать так:

Код:
	
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    ApplicationEvents1: TApplicationEvents;
    WordApplication1: TWordApplication;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
 protected
    function MouseLLHookProc(Code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
И поменять везде MouseLLHookProc на TForm1.MouseLLHookProc, то хук не отслеживается.
Помогите разобраться!!!
zhefran вне форума
Старый 06.05.2008, 13:36   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А в каком именно месте Access violation выбивает?
B_N вне форума
Старый 06.05.2008, 13:37   #3
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

В любой строчке внутри функции MouseLLHookProc, где присутствует WordApplication1.
Например:
Код:
   function MouseLLHookProc(Code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;  
 var 
    WordApplication1:TWordApplication 
    ms : MSLLHOOKSTRUCT;  
 begin  
 if (Code = HC_ACTION) then  
   begin  
      if wparam=wm_lbuttondown then  
         begin  
           ms := PMSLLHOOKSTRUCT(lParam)^;  
                  z:=ms.pt.Y;  
        end;  
     if wparam=Wm_mousemove then  
         begin  
       if GetAsyncKeyState(vk_lbutton)<>0 then begin  
         ms := PMSLLHOOKSTRUCT(lParam)^;  
          x1:=ms.pt.x;  
          y1:=ms.pt.Y; 
               wordapplication1.Disconnect; // Вот здесь 
             end;  
       end;  
     end;  
     Result:=CallNextHookEx(myhook,Code,wParam,lParam);  
 end;

Последний раз редактировалось zhefran; 06.05.2008 в 14:03.
zhefran вне форума
Старый 06.05.2008, 14:10   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Надо отладчиком смотреть. По-моему вызов COM-интерфейсов из хука ничем хорошим кончиться не должен. Если хотите, сбросьте проект или сюда, или мне в PM, посмотрю. Из этого кода даже не ясно, где wordapplication1 инициализируется...
B_N вне форума
Старый 06.05.2008, 14:20   #5
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Вот проэкт
Вложения
Тип файла: rar Wh_Mouse_ll.rar (182.1 Кб, 13 просмотров)
zhefran вне форума
Старый 06.05.2008, 14:42   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

zhefran, а почему Вы хук в экзешнике ставите, если WH_MOUSE_LL - Global only ??? Он ни к кому, кроме себя этот хук и не прицепляет, так точно ничего работать не будет, пишите dll. А какую из гор комментариев в этом архиве убрать я так и не понял... Зато добился того, о чём и предполагал - EOleSysError...
B_N вне форума
Старый 06.05.2008, 14:47   #7
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Если я не ошибаюсь, то WH_MOUSE_LL можно и внутри приложения вставлять, он все равно будет глобальным.
Цитата:
18-04-2008 07:27
Не слушайте Zhe_Fran, ловушку типа WH_MOUSE_LL не требуется размещать в отдельной библиотеке.

Автору:
почитайте внимательно описание LowLevelMouseProc и MSLLHOOKSTRUCT в MSDN и тогда станет ясно что вы всё делаете совершенно не правильно.
Модератор КС DRON
Цитата:
А какую из гор комментариев в этом архиве убрать я так и не понял...
Если комментарии оставить так как есть, то программа работает, тоесть ловит сообщения и позицию курсора передает в edit-ы. Позиция курсора относительно левой точки экрана.

Последний раз редактировалось zhefran; 06.05.2008 в 14:51.
zhefran вне форума
Старый 06.05.2008, 15:04   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

zhefran, ставить-то можно, только какой Вам смысл тогда в LL? Колесо можно и обычным хуком получить, а я всё-таки понял что Вам надо свой код в ворд загнать, с этой схемой через OLE Вы вряд ли чего добьётесь...
---------------------------
А ещё проще, сьавьте в хуке флажок, а снаружи хука его проверяйте и если этот способ с ole рабочий, значит вызывайте его уже оттуда.

Последний раз редактировалось B_N; 06.05.2008 в 15:13.
B_N вне форума
Старый 06.05.2008, 15:14   #9
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

B_N, мне нужно не колесо получить, а координаты курсора мышки при движении и зажатой ЛКМ.
Колесо мышки было в примере.
Схема такая:
Получить координаты при нажатой ЛКМ и получить координаты при движении. Сравнивать их и дальше по условию выполнять действие.
Если я вынесу в отдельную библиотеку, то как мне оттуда передавать значения моих переменных? Обязательно ли при этом использовать SendMessage?
zhefran вне форума
Старый 06.05.2008, 15:25   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А зачем тогда всё так усложнять? Если уж на то пошло, координаты можно вообще без всяких хуков получать. Попробуйте так, как я постом выше в правке добавил.
B_N вне форума
Закрытая тема


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скроллинг kl45gp JavaScript, Ajax 0 24.03.2008 23:29
Ms Word Farel Общие вопросы Delphi 0 12.01.2008 16:48
TChart, скроллинг zIG Компоненты Delphi 4 20.07.2007 11:55
Word Pad grafdi Помощь студентам 1 03.05.2007 02:39