powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват принтскрин
7 сообщений из 7, страница 1 из 1
Перехват принтскрин
    #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
Перехват принтскрин
    #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
Перехват принтскрин
    #39723912
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

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

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

С уважением, Polesov.
...
Рейтинг: 0 / 0
Перехват принтскрин
    #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
Перехват принтскрин
    #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
Перехват принтскрин
    #39723936
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9neНо я не понял почему?))Потому, что флаг устанавливается ДО ShowMessage

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


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