|
Вопрос # 647/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! Пишу программу для работы со "скриншотами". Не могу понять как сделать так, чтобы при нажатии какой-либо клавиши на клавиатуре происходило какое-либо действие, если программа в данный момент не активна, но запущена на компьютере(программа свернута или находится в системном трее). Подскажите, пожалуйста, код этого действия. Заранее спасибо.
 |
Вопрос задал: Wersel (статус: Посетитель)
Вопрос отправлен: 20 июня 2007, 17:28
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Градов Ю.М.
Здравствуйте, Wersel!
Привожу пример создания резидентной программы. Взята с сайта <a href=http://delphi.word.narod.ru<Link</a>
Приложение: Переключить в обычный режим- program MyResident;
- uses
- Windows,
- ShellAPI,
- Messages;
-
- const
-
-
-
-
- var
-
-
-
- function MyWndProc(wnd: hWnd; msg, wParam,
- lParam: longint): longint; stdcall;
- var
- p: TPoint;
- s: array [0..255] of char;
- tray: TNotifyIconData;
- begin
- case msg of
-
- GetCursorPos(p);
-
-
- GetClassName(GetForegroundWindow, s, length(s));
- if s <> 'WindowsScreenSaverClass'
- then SendMessage(wnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
- end;
- result := 0;
- end;
-
-
- if lparam = WM_RBUTTONUP then begin
- GetCursorPos(p);
- TrackPopupMenu(menu, TPM_LEFTALIGN, p.x, p.x, 0, wnd, nil);
- end;
- result := 0;
- end;
-
-
-
- if lo(lparam) = 0 then SendMessage(mywnd, WM_CLOSE, 0, 0);
- result := 0;
- end;
-
-
- SendMessage(wnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
- result := 0;
- end;
-
-
- with tray do begin
- cbSize := sizeof(TNotifyIconData);
- wnd := mywnd;
- uID := 0;
- end;
- Shell_NotifyIcon(NIM_DELETE, @tray);
- PostQuitMessage(0);
- result := 0;
- end;
- else Result := DefWindowProc(wnd, msg, WParam, LParam);
- end;
- end;
-
- function CreateMyWnd: hWnd;
- var
- wc: WndClass;
- begin
-
- wc.style := 0;
- wc.lpfnWndProc := @MyWndProc;
- wc.cbClsExtra := 0;
- wc.cbWndExtra := 0;
- wc.hInstance := hInstance;
- wc.hIcon := 0;
- wc.hCursor := 0;
- wc.hbrBackground := COLOR_WINDOW;
- wc.lpszMenuName := nil;
- wc.lpszClassName := ClassName;
- if RegisterClass(wc) = 0 then halt(0);
-
- result := CreateWindowEx(WS_EX_APPWINDOW, ClassName,
- 'My Window', WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil);
- if result = 0 then halt(0);
- end;
-
- procedure CreateTray;
- var
- tray: TNotifyIconData;
- begin
-
- with tray do begin
- cbSize := sizeof(TNotifyIconData);
- wnd := mywnd;
- uID := 0;
- uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
- uCallBackMessage := WM_NOTIFYTRAYICON;
- hIcon := LoadIcon(0, IDI_ASTERISK);
- szTip := ('My Resident');
- end;
- Shell_NotifyIcon(NIM_ADD, @tray);
- end;
-
- function CreateMyMenu: hMenu;
- begin
-
- result := CreatePopupMenu;
- if result = 0 then halt(0);
- if not AppendMenu(result, MF_STRING, 0, 'Exit') then halt(0);
- end;
-
- var
- msg: TMsg;
-
- begin
-
-
-
-
-
-
-
- while (GetMessage(msg, 0, 0, 0)) do begin
- TranslateMessage(msg);
- DispatchMessage(msg);
- end;
-
-
- end.
 |
Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 20 июня 2007, 19:31
Оценка за ответ: 3
|
Ответ #2. Отвечает эксперт: min@y™
Поищи примеры по функциям RegisterHotkey() и UregisterHotkey(). Они есть в инете на русском языке.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 июня 2007, 08:33
Оценка за ответ: 3
|
Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Wersel!
Нужно просто поставить Хук на клавиатуру. См. подробный пример в прикреплённом файле. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 23 июня 2007, 10:31; участников в обсуждении: 3.
|
Wersel (статус: Посетитель), 22 июня 2007, 12:55 [#2]:
Я сделал процедуры для RegisterHotkey() и UregisterHotkey():
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, 1 ,MOD_CONTROL,vk_F1);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, 1);
end;
А как объявить процедуру,при нажатии этой кнопки,тоесть:
_Процедура_нажатия_кнопки_
Begin
_Событие_присходящее_при_нажатии_этой_кнопки
End
Что надо прописать вместо "_Процедура_нажатия_кнопки_"?
|
|
min@y™ (статус: Доктор наук), 23 июня 2007, 10:31 [#3]:
Могу прислать 100% РАБОТАЮЩИЙ кусок кода из своей проги. Пишите письма.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|