| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |