Тимчасове відключення миші
Шановні майстри! Завдання така - необхідно тимчасово відключити миша (заборонити компонентів програми приймати повідомлення про те що кнопка миші натиснута) або взагалі її прибрати з екрану, а потім включити. Справа в тому що в мене на формі чотири кнопки, при натисканні на одну з них має відбуватися деякий дію, так от якщо користувач натисне під час виконання цієї дії іншу кнопку на формі, то буде велике ге. ) Як би вирішити цю проблему? Може не так радикально як з відключенням миші?
А уяви, що я не мишею на кнопку натисну, а за допомогою клави.
> Як би вирішити цю проблему?
.Enabled - для цього він і призначений.
Ось цитата (але рекомендовано в програмах без "глюків"!)
Включення і вимикання пристроїв введення / виводу з програми на Delphi
Іноді може виникнути необхідність в виключенні на час пристроїв введення - клавіатури і миші. Наприклад, це непогано зробити на час виконання коду системи захисту від копіювання, у іграх, або в якості "покарання" при запуску програми по закінченню терміну її безкоштовного використання. Однак найкраще її застосування - відключення клавіатури і миші на час роботи демонстраціонкі, заснованої на відтворенні записаних заздалегідь переміщень мишки і клавіатурного введення (див. Про це окремий розділ цієї книги). Це елементарно зробити за допомогою API:
EnableHadwareInput (Enable: boolean): boolean;
Enable - необхідний стан пристроїв введення (True - включені, false - вимкнені). Якщо введення заблокований, то його можна розблокувати вручну - натиснути Ctrl + Alt + Del, при появі меню "Завершення роботи програми" введення розблокується.
> Це елементарно зробити за допомогою API:
> EnableHadwareInput (Enable: boolean): boolean;
Ги ;-))
За умови незнання таких речей як Button.Enabled: = false;
> Ги ;-))
> За умови незнання таких речей як Button.Enabled: = false;
а якщо раптом їх Button сотні. ))
накажеш через ComponentCount їх відключати.
(Та й крім button може користувач че захоче: \\)
> У мене на формі чотири кнопки, при натисканні на одну з них має
> Відбуватися деякий дію, так от якщо користувач натисне
> Під час виконання цієї дії іншу кнопку на формі, то буде
> Велике ге. )
Чи не. Великого ге. тут можна уникнути тільки за допомогою спеціальних девайсів як порекомендував Вектор.
> А якщо раптом їх Button сотні. ))
а) Form.Enabled: = False;
б) ProgressForm.ShowModal;
Ну я робив звичайно типу ось цього:
var
button: Array [1..4] of TPanel; // масив панелей службовців у мене кнопками
.
begin
for i: = 1 to 4 do # XA0; button [i] .Enabled: = false; // відключення їх відразу після натискання на одну з них (після якогось часу 1с. Включаю назад).
Але вся заковика в тому що натискання запам'ятовуються! І після натискання мишой на будь-яку кнопку-панель, хоча вона і disabled, при зворотному її включенні винда обробляє посилається їй код! Ось у чому проблемс.
>> Це елементарно зробити за допомогою API:
>> EnableHadwareInput (Enable: boolean): boolean;
А можна докладніше? Як це зробити (з прикладом) в довідці Дельфах нічого не знайшов.
спробуй після цього
for i: = 1 to 4 do # XA0; button [i] .Enabled: = false;
зробити це
Application.ProcessMessages;
имхо, має допомогти
uses
# XA0; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
# XA0; Dialogs, ExtCtrls, StdCtrls;
type
# XA0; TForm1 = class (TForm)
# XA0; # XA0; Panel1: TPanel;
# XA0; # XA0; Panel2: TPanel;
# XA0; # XA0; procedure Panel1Click (Sender: TObject);
# XA0; # XA0; procedure Panel2Click (Sender: TObject);
# XA0; private
# XA0; # XA0;
# XA0; public
# XA0; # XA0;
# XA0; end;
var
# XA0; Form1: TForm1;
# XA0; GlobalPerem: Boolean = False;
implementation
procedure TForm1.Panel1Click (Sender: TObject);
begin
GlobalPerem: = True;
// і все що повинен зробити клік на цій панелі
end;
procedure TForm1.Panel2Click (Sender: TObject);
begin
if GlobalPerem then
begin
ShowMessage ( "ГЕ");
// і все що повинен зробити клік на цій панелі
end;
end;
ще є Tag "і і case | of
і nil для процедур при перевірці умов (а без них ніяк в даній постановці завдання)
ЗИ. Ви б ще моніторів обрубали
procedure TForm1.Panel1Click (Sender: TObject);
begin
початку всі дії а потім
GlobalPerem: = True;
end;
for I: = 0 to ControlCount -1 do
if Controls [I] is TPanel then
TPanel (Controls [I]). Enabled: = False;
>> Garfunkel # XA0; (23.10.04 23:26) [9]
>> Ну я робив звичайно типу ось цього:
>> var
>> button: Array [1..4] of TPanel; // масив панелей службовців у мене >> кнопками
>>.
>> begin
>> for i: = 1 to 4 do # XA0; button [i] .Enabled: = false; // відключення їх >> відразу після натискання на одну з них (після якогось часу 1с. >> включаю назад).
>> Але вся заковика в тому що натискання запам'ятовуються! І після >> натискання мишой на будь-яку кнопку-панель, хоча вона і disabled, при >> зворотному її включенні винда обробляє посилається їй код! Ось >> в чому проблемс.
Якби вони у вас енеблілілісь (перепрошую за слово) то нічого б їм Windows потім не посилала
А якщо їх чотири я б і ніяких масивів не оголошувала (имхо, але на смак і колір.)
Дівчата у нас розумнішими хлопчиків :-)
Ось ще б подобріла
Можна поставити таймер і відправляти постійно SetCursorPos (0,0);
Мабуть постів ви не читали
Де то я бачила як програмно натиснути Reset
зла дівчинка
> Якби вони у вас енеблілілісь (перепрошую за слово) то нічого б їм
> Windows потім не посилала
> А якщо їх чотири я б і ніяких масивів не оголошувала (имхо, але на
> Смак і колір. )
Просто так мені зручніше виходячи з завдання програми - чотири відповіді на питання "розпихати" по чотирьох кнопок методом Random. FindComponent тут мені здалося громіздким. Коротше, так було краще на мій погляд.
До речі я знайшов оригінальне рішення - я просто роблю SwapMouseButton (False);
і пізніше SwapMouseButton (True);
на виході з програми для вірності возращаться SwapMouseButton (True);
так як права кнопка мишки у мене в програмі не працює, то мене таке рішення по суті влаштовує, хоча і не повністю, але. "Через брак двірника мали покоївку."
а може вам допоможе код з конференції
Kisa # XA0; (20.04.01 09:58)
Тільки в 98!
Disable Mouse and Keyboard
procedure TForm1.Button1Click (Sender: TObject);
function FuncAvail (_dllname, _funcname: string; var _p: pointer): boolean;
# XA0; var _lib: tHandle;
# XA0; begin
# XA0; Result: = false;
# XA0; _p: = NIL;
# XA0; if LoadLibrary (PChar (_dllname)) = 0 then exit;
# XA0; _lib: = GetModuleHandle (PChar (_dllname));
# XA0; if _lib <> 0 then
# XA0; # XA0; begin
# XA0; # XA0; _p: = GetProcAddress (_lib, PChar (_funcname));
# XA0; # XA0; if _p <> NIL then Result: = true;
# XA0; # XA0; end;
# XA0; end;
var
# XA0; xBlockInput. function (Block: BOOL): BOOL; stdcall;
begin
# XA0; if FuncAvail ( "USER32.DLL", "BlockInput", @xBlockInput) = true then
# XA0; begin
# XA0; xBlockInput (true);
# XA0; Sleep (5000);
# XA0; xBlockInput (false);
# XA0; end;
end;
Що ж ви потихеньку користувача мучите
Те йому миша відключити то клаву тепер курсор в початок екрана заженемо. Давайте відразу уб'ём його ресета. Оригінально оформимо в актівХ бібліліотеку прорегім і кожні п'ять хвилин будемо ресет жати
за таймером тільки по апішному (адже API рулить?).
Нахрена нам взагалі VCL.
Такі проги просто лякають користувача і дорога їм в кошик.
Garfunkel # XA0; (24.10.04 21:53) [22]
SwapMouseButton- ну якщо допомагає ваша справа
Panel2.OnClick: = nil;
в кінці
Panel2.OnClick: = Panel2Click;
Добра дівчинка # XA0; (25.10.04 5:59) [24]
А ще надійніше, а то іало чи які AV чекають
Panel2.OnClick: = nil;
try
# XA0 ;.
finally
# XA0; Panel2.OnClick: = Panel2Click;
end;
P.S. У Злий дівчинки тон був добрішим, ніж у Доброї :( Залишайся злий.)
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.
Добра дівчинка
я знаю що
the mouse is a shared resource and reversing the meaning of its buttons affects all applications
на виході з програми для вірності возращаться
SwapMouseButton (True);
щоб чого не було. Я визнаю що це "кривуватий" спосіб. Але де взяти простий, доступний спосіб для тимчасового відключення миші? Я програміст і це просто моя навчальна програма. Тому не хочу просто сліпо копіювати чужий код без розуміння як він працює. Я думав що відключення миші це хвилинна справа, а виявилося. Це ціла проблема.
Пам'ять: 0.79 MB
Час: 0.124 c