Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отловить двойной клик на рабочем столе, Без Хука с DLL 
:(
    Опции темы
DriveSoftware
Дата 30.12.2004, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4



Как можно отловить двойной клик мышью на рабочем столе без хука с DLL ???

Состояние мыши можно проверить так
GetAsyncKeyState(VK_LBUTTON)

но как это реализовать, не соображу )
Может есть другой способ? главное чтоб без DLL
PM MAIL WWW ICQ   Вверх
Bes
Дата 30.12.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Дак, я думаю, что проблема еще в том, что таким образом ты сможешь отлавливать двойной щелчек в принципе, а где будет этот двойной щелчек?.... Хотя вроде есть способ узнать окно фокуса и по-моему даже где-то здесь обсуждалось.
Кроме того если бы я пользовался такой функцией, то вычислял бы время м/у двумя щелчками, а т.к. скорость двойного щелчка настраивается в виндовс, то нужно еще откуда-то выдернуть эту константу....
Короче, надо искать способ по-проще... :-) правда не уверен, что он есть.

Щас сделал таймер с одной миллисекундой и в мемо результат твойе функции заносил - двойной клик выглядит так
0
0
0
0
0
-32767
-32768
-32768
-32768
0
0
0
0
0
0
-32767
-32768
-32768
0
0
0

т.е. 0-отпущена видимо само нажатие -32767, а -32768 - это нажатое состояние. - период м/у щелчками получился примерно 6 мс. Ща еще че-нить попробую.

Это сообщение отредактировал(а) Bes - 30.12.2004, 11:30
PM MAIL   Вверх
Bes
Дата 30.12.2004, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



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



Работа с другим приложением без Hook и DLL на примере GetFocus

Своим опытом делится SottNick:
На стандартной форме (Form1):

Form1.FormStyle=fsStayOnTop - форма поверх остальных окон

Объекты:

ТАЙМЕР (Timer1) с периодом 1000 или меньше,
3 метки (Label1, Label2, Label3). назначение их см. в тексте процедуры
У таймера событие OnTimer. а вот для нее обработчик:

--------------------------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);

var
dwTargetOwner :DWORD;//указатель на подключаемый процесс
dwThreadID :DWORD;//указатель на текущий процесс
Result:longbool;
begin

{В первой метке отображается Handle активного окна}
Label1.Caption:=IntToStr(GetForegroundWindow);//указатель на подключаемое приложение


// Подключение потока другого окна
dwTargetOwner := GetWindowThreadProcessId(GetForegroundWindow,nil);//указатель на подключаемый процесс
dwThreadID := GetCurrentThreadId();//указатель на текущий процесс
if (dwTargetOwner <>dwThreadID) then // если не один и тот же процесс
Result := AttachThreadInput(dwThreadID, dwTargetOwner, TRUE);//подключение


{Во второй метке отображается Handle объекта 'в фокусе' в активном окне}
Label2.Caption:=IntToStr(GetFocus);//фокус в другом приложении


if (Result) then
AttachThreadInput(dwThreadID, dwTargetOwner, FALSE);//отключение


{В третей метке отображается Handle объекта 'в фокусе' в активном окне,
но если это окно другого приложения, то Handle будет равен нулю,
т.к. попытка получения Handle происходит после отключения потока}
Label3.Caption:=inttostr(GetFocus);//проверка после отключения


{Эффект можно посмотреть, если запустить полученное приложение
и сделать активным другое приложение}
{Ясно, что полученный Handle объекта можно использовать
по своему разумению. Например, считать из объекта текст и т.п.}


// © SottNick 2000
end;

PM MAIL   Вверх
<Spawn>
Дата 30.12.2004, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Почему только вот хук не устраивает?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
DriveSoftware
Дата 30.12.2004, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4



Bes

Спасибо, вроде решил проблему, не знаю на скока это рационально, закрутить в таймере GetAsyncKeyState(VK_LBUTTON) но работает, исходник:

Timer.Interval:=50;

Код

procedure TfrmMain.TimerMouseTimer(Sender: TObject);
var
 MS: word;
 P: TPoint;
 S: array[0..255] of Char;
begin
 MS:=300; {Время, в период которого должен произойти дабл клик}

 GetCursorPos(P);
 GetClassName(WindowFromPoint(P), S, 255);
 if S<>'SysListView32' then Exit;

 if (ClickCount=0) and (GetAsyncKeyState (VK_LBUTTON)<>0) then
 begin
   FirstClick:=GetTickCount;
   ClickState:=True;
 end;

 if FirstClick > (GetTickCount - MS) then
 begin
   if (ClickState) and ( GetAsyncKeyState (VK_LBUTTON)=0 ) then
   begin
     Inc(ClickCount);
     ClickState:=False;
   end;

   if (not ClickState) and ( GetAsyncKeyState (VK_LBUTTON)<>0 ) then
   begin
     Inc(ClickCount);
     ClickState:=True;
   end;

 end else
 begin
   ClickCount:=0;
   ClickState:=False;
 end;

 if ClickCount>2 then {Таким образом можно сделать и Трабл клик или хоть 10-клик)}
 begin
   ClickCount:=0;
   FirstClick:=0;
   ShowMessage('Double Click');
 end;


end;


PM MAIL WWW ICQ   Вверх
Bes
Дата 30.12.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Да согласен, на счет рациональности - тут большой вопрос, но как говриться на безрыбьи и рыбу... Хотя я бы тоже хотел увидеть какое-нить красивое решение.
PM MAIL   Вверх
DriveSoftware
Дата 30.12.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4



А время дабл клика можно выяснить с помощью GetSystemMetrics

либо в реестре:
HKEY_CURRINT_USER\Control Panel\Mouse - DoubleClickSpeed

у меня там 500, т.е. для этого кода нужно будет присвоить переменной MS=500

и еще, забыл упомянуть про глобальные перменные:

Код

var  
 FirstClick: Cardinal;
 ClickCount: integer=0;
 ClickState: Boolean=False;

Добавлено @ 11:51
<Spawn>

Честно, просто не хочеться вазиться с DLL
я пишу шароварный проект, и просто нуу не хочеться smile

да и слышал я где то, что хуки с DLL напригают систему и в MSDK их использоваться не рекомендуется.
PM MAIL WWW ICQ   Вверх
Bes
Дата 30.12.2004, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



2DriveSoftware: во, тоже спасибо - буду знать. :-)
PM MAIL   Вверх
<Spawn>
Дата 30.12.2004, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(DriveSoftware @ 30.12.2004, 03:48)
Добавлено @ 11:51
<Spawn>

Честно, просто не хочеться вазиться с DLL
я пишу шароварный проект, и просто нуу не хочеться smile

да и слышал я где то, что хуки с DLL напригают систему и в MSDK их использоваться не рекомендуется.

Я не думаю, что таймер с периодом в 50 мс, будет меньше нагружать системуsmile


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
DriveSoftware
Дата 30.12.2004, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4



<Spawn>

памерю патом каким нить монитором на загрузку процессора smile
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1114 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.