Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват принтскрин / 7 сообщений из 7, страница 1 из 1
27.10.2018, 15:11
    #39723890
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
Добрый день!
Есть глобальный хук, который перехватывает нажатие кнопки PrintScreen, вы все его наверно знаете...
При нажатии кнопки, выходит сообщение, ну это чисто для проверки...
Как можно сделать так, что бы срабатывало один раз, к примеру только если нажали, или если отжали?
А то если зажать кнопку, то ShowMessage('GotIt'); дублируется много раз, пока не отпустишь кнопку.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
type

              TForm1 = class(TForm)

                procedure FormCreate(Sender: TObject);

                procedure FormDestroy(Sender: TObject);

              private

                { Private declarations }

                procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;

              public

                { Public declarations }

              end;

 

            var

              Form1: TForm1;

 

            implementation

 

            {$R *.DFM}

 

            const id_SnapShot = 101;

 

            procedure TForm1.WMHotKey (var Msg : TWMHotKey);

            begin

              if Msg.HotKey = id_SnapShot then

                ShowMessage('GotIt');

            end;

 

            procedure TForm1.FormCreate(Sender: TObject);

            begin

              RegisterHotKey(Form1.Handle,

                             id_SnapShot,

                             0,

                             VK_SNAPSHOT);

            end;

 

            procedure TForm1.FormDestroy(Sender: TObject);

            begin

              UnRegisterHotKey (Form1.Handle, id_SnapShot);

            end;

...
Рейтинг: 0 / 0
27.10.2018, 16:21
    #39723902
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
Пробовал ставить флаг boolean, но не помогает, флаг начинает работать только после отжатия клавиши.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var PrintBool: boolean;
{.....}
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
PrintBool := False;
end;


procedure TForm1.WMHotKey(var Msg: TWMHotKey); // print screen hotkey
begin

  if PrintBool = False  then
  BEGIN
     if Msg.HotKey = id_SnapShot then
  ShowMessage('a');
  PrintBool := True;
  END;

end;
...
Рейтинг: 0 / 0
27.10.2018, 18:16
    #39723912
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
Tech N9ne,

Можно отслеживать отпускание клавиши VK_SNAPSHOT через событие OnKeyUp.
Только надо выставить у формы свойство KeyPreview := True.
Но в приведенном коде событие отпускания клавиши получит окно ShowMessage.

P.S. А почему Handle берется у конкретного экземпляра Form1, а не у Self?

С уважением, Polesov.
...
Рейтинг: 0 / 0
27.10.2018, 19:49
    #39723926
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
А если так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.WMHotKey(var Msg: TWMHotKey); // print screen hotkey
begin
  if not PrintBool then begin
    if Msg.HotKey = id_SnapShot then begin
      PrintBool := True;
      ShowMessage('a');
    end;
  end;
end;
...
Рейтинг: 0 / 0
27.10.2018, 20:45
    #39723933
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
_Vasilisk_А если так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.WMHotKey(var Msg: TWMHotKey); // print screen hotkey
begin
  if not PrintBool then begin
    if Msg.HotKey = id_SnapShot then begin
      PrintBool := True;
      ShowMessage('a');
    end;
  end;
end;


Вроде работает, спасибо.
Но я не понял почему?)) Почему if not работает, а if false нет?
...
Рейтинг: 0 / 0
27.10.2018, 21:08
    #39723936
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
Tech N9neНо я не понял почему?))Потому, что флаг устанавливается ДО ShowMessage

ShowMessage активирует оконный цикл и новые сообщения начинают поступать до того, как закончена обработка предыдущих. Замените ShowMessage на Запись в лог + Sleep и ваш исходный код тоже будет работать
...
Рейтинг: 0 / 0
27.10.2018, 21:23
    #39723937
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват принтскрин
_Vasilisk_,
аа)) ясно, благодарю!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват принтскрин / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]