Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

Временное отключение мыши   Найти похожие ветки 

 
Garfunkel   (2004-10-22 01:12) [0]

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


 
Gero ©   (2004-10-22 01:18) [1]

А представь, что я не мышью на кнопку нажму, а с помощью клавы.

> Как бы решить эту проблему?

.Enabled - для этого он и предназначен.


 
имя   (2004-10-22 02:36) [2]

Удалено модератором


 
kostan ©   (2004-10-22 02:36) [3]

Вот цитата (но рекомендовано в программах без "глюков"!)

Включение и выключение устройств ввода/вывода из программы на Delphi

Иногда может возникнуть необходимость в выключении на время устройств ввода - клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве "наказания" при запуске программы по истечению срока ее бесплатного использования ... . Однако наилучшее ее применение - отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:
EnableHadwareInput(Enable:boolean): boolean;
Enable - требуемое состояние устройств ввода (True - включены, false - выключены). Если ввод заблокирован, то его можно разблокировать вручную - нажать Ctrl + Alt + Del, при появлении меню "Завершение работы программы" ввод разблокируется.


 
kostan ©   (2004-10-22 02:42) [4]

Удалено модератором


 
Гарри Поттер ©   (2004-10-22 02:46) [5]

>Это элементарно сделать при помощи API:
>EnableHadwareInput(Enable:boolean): boolean;

Гы ;-))
При условии незнания таких вещей как Button.Enabled := false;


 
kostan ©   (2004-10-22 02:59) [6]

>Гы ;-))
>При условии незнания таких вещей как Button.Enabled := false;

а если вдруг их Button сотни ! :))
прикажешь через ComponentCount их отключать ???
(да и помимо button может пользователь че захочет :\\)


 
Гарри Поттер ©   (2004-10-22 03:10) [7]

>у меня на форме четыре кнопки, при нажатии на одну из них должно
> совершаться некоторое действие, так вот если пользователь нажмет
>во время исполнения этого действия другую кнопку на форме, то будет
>большое гэ...:)

Не... Большого гэ.. тут можно избежать только при помощи специальных девайсов как порекомендовал Вектор.


 
Gero ©   (2004-10-22 07:46) [8]


> а если вдруг их Button сотни ! :))

а) Form.Enabled := False;
б) ProgressForm.ShowModal;


 
Garfunkel   (2004-10-23 23:26) [9]

Ну я делал конечно типа вот этого:
var
button:Array[1..4]of TPanel;//массив панелей служащих у меня кнопками
....

begin
for i:=1 to 4 do  button[i].Enabled:=false; //отключение их сразу после нажатия на одну из них (после некоего времени 1с. включаю обратно).

Но вся загвоздка в том что нажатия запоминаются! И после нажатия мышой на любую кнопку-панель, хотя она и disabled, при обратном ее включении винда обрабатывает посылаемый ей код! Вот в чем проблемс...


 
Garfunkel   (2004-10-23 23:31) [10]

>> Это элементарно сделать при помощи API:
>>EnableHadwareInput(Enable:boolean): boolean;

А можно подробнее? Как это сделать (с примером) в справке Дельфей ничего не нашел.


 
Гарри Поттер ©   (2004-10-24 01:37) [11]

попробуй после этого
for i:=1 to 4 do  button[i].Enabled:=false;
сделать это
Application.ProcessMessages;

имхо, должно помочь


 
Злая девочка   (2004-10-24 08:33) [12]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Panel2: TPanel;

   procedure Panel1Click(Sender: TObject);
   procedure Panel2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 GlobalPerem: Boolean = False;
implementation

{$R *.dfm}

procedure TForm1.Panel1Click(Sender: TObject);
begin
GlobalPerem:= True;
// и все что должен сделать клик на этой панели
end;

procedure TForm1.Panel2Click(Sender: TObject);
begin
if GlobalPerem then
begin
ShowMessage("ГЭ");
// и все что должен сделать клик на этой панели
end;
end;

end.


 
Злая девочка   (2004-10-24 08:42) [13]

еще есть Tag"и и case | of
и nil для процедур при проверке условий(а без них никак в данной постановке задачи)
ЗЫ. Вы бы еще монито обрубили


 
Злая девочка   (2004-10-24 09:08) [14]

procedure TForm1.Panel1Click(Sender: TObject);
begin
начала все действия а потом
GlobalPerem:= True;
end;


 
Anatoly Podgoretsky ©   (2004-10-24 10:04) [15]

kostan ©   (22.10.04 02:59) [6]
Какие сотни, у него всего 4 и те заранее известны.


 
Злая девочка   (2004-10-24 10:29) [16]

kostan ©   (22.10.04 02:59) [6]
>> (да и помимо button может пользователь че захочет :\\)

for I:=0 to ControlCount -1 do
if Controls[I] is TPanel then
TPanel(Controls[I]).Enabled:= False;


 
Злая девочка   (2004-10-24 10:42) [17]

>>Garfunkel   (23.10.04 23:26) [9]

>>Ну я делал конечно типа вот этого:
>>var
>>button:Array[1..4]of TPanel;//массив панелей служащих у меня >>кнопками
>>....

>>begin
>>for i:=1 to 4 do  button[i].Enabled:=false; //отключение их >>сразу после нажатия на одну из них (после некоего времени 1с. >>включаю обратно).

>>Но вся загвоздка в том что нажатия запоминаются! И после >>нажатия мышой на любую кнопку-панель, хотя она и disabled, при >>обратном ее включении винда обрабатывает посылаемый ей код! Вот >>в чем проблемс...

Если бы они у вас энеблилились(извиняюсь за слово) то ничего бы им Windows потом не посылала
А если их четыре я бы и никаких массивов не объявляла(имхо, но на вкус и цвет...)


 
Anatoly Podgoretsky ©   (2004-10-24 11:38) [18]

Девочки у нас умнее мальчиков :-)
Вот еще бы подобрела


 
TeNY ©   (2004-10-24 13:53) [19]

Можно поставить таймер и отправлять постоянно SetCursorPos(0,0);


 
Злая девочка   (2004-10-24 14:08) [20]

TeNY ©   (24.10.04 13:53) [19]

Видимо постов вы не читали
Где то я видела как програмно нажать Reset


 
TeNY ©   (2004-10-24 17:05) [21]


> Злая девочка   (24.10.04 14:08) [20]
> TeNY ©   (24.10.04 13:53) [19]
>
> Видимо постов вы не читали
> Где то я видела как програмно нажать Reset

А 4ЕМ тебе мой мой пример не понравился он ведь работает
а вот резет можно функцией апи нажать bool SetResetStatus(LPRESETSTASUS Status) это из MSDN верезка,так что ты отстала от жизни девочка :)


 
Garfunkel   (2004-10-24 21:53) [22]

Злая девочка
>Если бы они у вас энеблилились(извиняюсь за слово) то ничего бы им
> Windows потом не посылала
>А если их четыре я бы и никаких массивов не объявляла(имхо, но на
> вкус и цвет...)
Просто так мне удобнее исходя из задачи программы - четыре ответа на вопрос "распихиваются" по четырем кнопкам методом Random. FindComponent здесь мне показалось громоздким. Короче, так было лучше на мой взгляд.
Кстати я нашел оригинальное решение - я просто делаю SwapMouseButton(False);
и позже SwapMouseButton(True);
на выходе из программы для верности возращаю SwapMouseButton(True);
так как правая кнопка мышки у меня в программе не работает, то меня такое решение можно сказать устраивает, хотя и не полностью, но... "за неимением дворника имели горничную..."


 
DIS   (2004-10-24 21:56) [23]

а может вам поможет код из конференции

Kisa   (20.04.01 09:58)
Только в 98!

Disable Mouse and Keyboard

{Button1 on Form1 - disable mouse and keyboard for 5 seconds}

procedure TForm1.Button1Click(Sender: TObject);

function FuncAvail(_dllname, _funcname: string; var _p: pointer): boolean;
 var _lib: tHandle;
 begin
  Result := false;
  _p := NIL;
  if LoadLibrary(PChar(_dllname)) = 0 then exit;
  _lib := GetModuleHandle(PChar(_dllname));
  if _lib <> 0 then
   begin
   _p := GetProcAddress(_lib, PChar(_funcname));
   if _p <> NIL then Result := true;
   end;
 end;


var
  xBlockInput : function(Block: BOOL): BOOL; stdcall;

begin
 if FuncAvail("USER32.DLL", "BlockInput", @xBlockInput) = true then
 begin
  xBlockInput(true);
  Sleep(5000);
  xBlockInput(false);
 end;
end;


 
Добрая девочка   (2004-10-25 05:59) [24]

TeNY ©   (24.10.04 17:05) [21]
От жизни отстала?
Ни к такой стремлюсь

Что же вы потихоньку юзера мучаете
То ему мышь отключить то клаву теперь курсор в начало экрана загоним. Давайте сразу убъём его ресетом. Оригинально оформим в активХ библилиотеку прорегим и каждые пять минут будем ресет жать
по таймеру только по апишному(ведь API рулит?).
Нахрена нам вообще VCL.

Такие проги просто пугают юзера и дорога им в корзину.

Garfunkel   (24.10.04 21:53) [22]
SwapMouseButton- ну если помогает ваше дело

Вначале процедуры

Panel2.OnClick:= nil;
вконце
Panel2.OnClick:= Panel2Click;


 
ЮЮ ©   (2004-10-25 08:31) [25]

Добрая девочка   (25.10.04 05:59) [24]
А ещё надежнее, а то иало ли какие AV поджидают

Panel2.OnClick:= nil;
try
 ...
finally
 Panel2.OnClick:= Panel2Click;
end;

P.S. У Злой девочки тон был добрее, чем у Доброй :( Оставайся злой!!! :)


 
Добрая девочка   (2004-10-25 08:33) [26]

Remarks

Button swapping is provided as a convenience to people who use the mouse with their left hands. The SwapMouseButton function is usually called by Control Panel only. Although an application is free to call the function, the mouse is a shared resource and reversing the meaning of its buttons affects all applications.


 
Добрая девочка   (2004-10-25 08:35) [27]

>>ЮЮ ©   (25.10.04 08:31) [25]
Кто - то обиженный использовал этот ник и анкетировал его


 
Garfunkel   (2004-10-26 01:37) [28]

Добрая девочка
я знаю, что
the mouse is a shared resource and reversing the meaning of its buttons affects all applications
на выходе из программы для верности возращаю
SwapMouseButton(True);
чтоб чего не было. Я признаю что это "кривоватый" способ. Но где взять простой, доступный способ для временного отключения мыши? Я начинающий программист и это просто моя учебная программа. Поэтому не хочу просто слепо копировать чужой код без понимания как он работает. Я думал что отключение мыши это минутное дело, а оказалось... Это целая проблема.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.041 c
1-1098423661
denis24
2004-10-22 09:41
2004.11.07
разбивка строки на слова


14-1098004629
123
2004-10-17 13:17
2004.11.07
Счетчик интернета.


1-1098650806
Gear
2004-10-25 00:46
2004.11.07
Красивое обрезание длинных строк в ListBox...


14-1097909032
ivan1
2004-10-16 10:43
2004.11.07
защита программы


14-1097705686
Piter
2004-10-14 02:14
2004.11.07
Позор... Россия 1 - 7 Португалия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский