Форум: "Основная";
Текущий архив: 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.039 c