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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2008, 06:45   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Контроль Scroll Lock

Привет всем! Как мне установить контроль за такими клавишами, как Scroll Lock, Caps Lock, Num Lock? Первый шаг я уже сделал: Зарил её как HOT KEY.
А как уснать, нажата ли она, или нет?
Altera вне форума Ответить с цитированием
Старый 06.11.2008, 07:53   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Код:
case GetKeyState(VK_SCROLL) of
  0: Label1.Caption := 'Не горит...';
  1: Label1.Caption := 'Горит!';
end;
Так же и для VK_NUMLock, и для CapsLock
Баламут вне форума Ответить с цитированием
Старый 06.11.2008, 12:31   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

2Баламут, не помогает. Не действует вообще.
Дело в том, не катит под горячии клавиши...

[CODE]
...
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
...
RegisterHotKey(Handle, VK_SCROLL, 0, VK_SCROLL);
...
procedure TEXE_FORM1.WMHotKey(var Msg: TWMHotKey);
begin
if GetKeyState(VK_SCROLL) and 1 = 0 then
caption := 'Нажата'
else
caption := 'Не нажата';
end;
...
/CODE]

Последний раз редактировалось Altera; 06.11.2008 в 12:59.
Altera вне форума Ответить с цитированием
Старый 06.11.2008, 13:51   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Хм... Интересно. Буду думать. А ты может расскажешь пока, почету так принципиально отслежить состояние именно в этом месте?
Баламут вне форума Ответить с цитированием
Старый 06.11.2008, 18:17   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Хм... Интересно. Буду думать. А ты может расскажешь пока, почету так принципиально отслежить состояние именно в этом месте?
Ну, можно ещё и с помощью таймера...
Но мне интересно с hot key
Altera вне форума Ответить с цитированием
Старый 07.11.2008, 01:22   #6
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Именно с таймером я и эксперемнтировал, прежде чем выложить решение. А еще с обработчиком KeyUp формы. Здесь тоже все работает. С HotKey будем разбираться. Самому интересно стало.
Баламут вне форума Ответить с цитированием
Старый 07.11.2008, 07:00   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Именно с таймером я и эксперемнтировал, прежде чем выложить решение. А еще с обработчиком KeyUp формы. Здесь тоже все работает. С HotKey будем разбираться. Самому интересно стало.
Дело в том, что при hot key клавиша глобальная, нежели при tForm.keyUp
Altera вне форума Ответить с цитированием
Старый 07.11.2008, 10:04   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Мне кажется это из-за того, что WM_HOTKEY отлавливается при нажатой кнопке и надо просто немного подождать (до того момента как клавишу отпустят). Поставить на поток или на таймер.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button2: TButton;
    procedure WMHotKey(var Msg: TWMHotKey);
      message WM_HOTKEY;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type tnew = class(tthread)
  protected
    procedure execute; override;
  end;

var
  Form1: TForm1;
  new: tnew;

implementation

{$R *.dfm}

procedure tnew.execute;
begin
  sleep(50);
  if 0 <> (GetKeyState(VK_SCROLL) and $01) then
  form1.caption := 'вкл' else form1.caption := 'выкл';
end;

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  Msg.Result := 0;
  new := tnew.create(true);
  new.priority := tpnormal;
  new.resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  RegisterHotKey(Handle, VK_SCROLL, 0, VK_SCROLL);
end;

end.
eoln вне форума Ответить с цитированием
Старый 07.11.2008, 15:14   #9
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Тоже самое пытался сделать без потока... Не сработало. Но дело даже не в этом. При повторном нажатии (состояние изменилось в предыдущем екшене) опять же ничего не происходит. Т.е. на данный момент результат вроде есть, а понимания происходящего нет. А это не есть гуд.

Последний раз редактировалось Баламут; 07.11.2008 в 15:20.
Баламут вне форума Ответить с цитированием
Старый 07.11.2008, 19:04   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Вот что решил, без цыклов и потоков:
Код:
unit Unit_;

interface

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

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
   procedure AppOnMessage(var Msg :TMsg; var Handled :Boolean);
   Procedure RStat;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnMessage := AppOnMessage;
 RStat;
end;

Procedure TForm1.RStat;
begin
 CheckBox1.Checked := Odd(GetKeyState(VK_CAPITAL));
 CheckBox2.Checked := Odd(GetKeyState(VK_NUMLOCK));
 CheckBox3.Checked := Odd(GetKeyState(VK_SCROLL));
end;

procedure TForm1.AppOnMessage(var Msg :TMsg; var Handled :Boolean);
begin
 Case Msg.Message of
  WM_KEYDOWN, WM_KEYUP:
   begin
    Case Msg.Wparam of
     VK_CAPITAL,
     VK_NUMLOCK,
     VK_SCROLL: RStat;
    end;
   end;
 end;
end;

end.
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не получается изменить NUM,CAps,scroll Lock Reds Общие вопросы Delphi 1 29.09.2008 15:31
Scroll в DBGrid и StringGrid Roof Компоненты Delphi 2 27.07.2008 17:46
Заставить мигать Scroll Lock snegok74 Общие вопросы Delphi 12 06.06.2008 14:02
Накой кнопка Scroll Lock??? Altera Компьютерное железо 4 05.06.2008 00:42
scroll в webbrouser MaslCS Компоненты Delphi 4 23.01.2008 22:58