Componentes.Terceros.jvcl/official/3.39/run/JvAppCommand.pas
2010-01-18 16:55:50 +00:00

237 lines
7.0 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvAppCommand.PAS, released on 2005-09-02.
The Initial Developer of the Original Code is Robert Marquardt [robert_marquardt att dmx dott de]
Portions created by Robert Marquardt are Copyright (C) 2001 Robert Marquardt.
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.delphi-jedi.org
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvAppCommand.pas 12461 2009-08-14 17:21:33Z obones $
unit JvAppCommand;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Windows, Messages, SysUtils, Classes, Controls, Forms,
JvComponentBase;
const
// from JwaWinUser.pas
WM_APPCOMMAND = $0319;
// Cmd values
APPCOMMAND_BROWSER_BACKWARD = 1;
APPCOMMAND_BROWSER_FORWARD = 2;
APPCOMMAND_BROWSER_REFRESH = 3;
APPCOMMAND_BROWSER_STOP = 4;
APPCOMMAND_BROWSER_SEARCH = 5;
APPCOMMAND_BROWSER_FAVORITES = 6;
APPCOMMAND_BROWSER_HOME = 7;
APPCOMMAND_VOLUME_MUTE = 8;
APPCOMMAND_VOLUME_DOWN = 9;
APPCOMMAND_VOLUME_UP = 10;
APPCOMMAND_MEDIA_NEXTTRACK = 11;
APPCOMMAND_MEDIA_PREVIOUSTRACK = 12;
APPCOMMAND_MEDIA_STOP = 13;
APPCOMMAND_MEDIA_PLAY_PAUSE = 14;
APPCOMMAND_LAUNCH_MAIL = 15;
APPCOMMAND_LAUNCH_MEDIA_SELECT = 16;
APPCOMMAND_LAUNCH_APP1 = 17;
APPCOMMAND_LAUNCH_APP2 = 18;
APPCOMMAND_BASS_DOWN = 19;
APPCOMMAND_BASS_BOOST = 20;
APPCOMMAND_BASS_UP = 21;
APPCOMMAND_TREBLE_DOWN = 22;
APPCOMMAND_TREBLE_UP = 23;
APPCOMMAND_MICROPHONE_VOLUME_MUTE = 24;
APPCOMMAND_MICROPHONE_VOLUME_DOWN = 25;
APPCOMMAND_MICROPHONE_VOLUME_UP = 26;
APPCOMMAND_HELP = 27;
APPCOMMAND_FIND = 28;
APPCOMMAND_NEW = 29;
APPCOMMAND_OPEN = 30;
APPCOMMAND_CLOSE = 31;
APPCOMMAND_SAVE = 32;
APPCOMMAND_PRINT = 33;
APPCOMMAND_UNDO = 34;
APPCOMMAND_REDO = 35;
APPCOMMAND_COPY = 36;
APPCOMMAND_CUT = 37;
APPCOMMAND_PASTE = 38;
APPCOMMAND_REPLY_TO_MAIL = 39;
APPCOMMAND_FORWARD_MAIL = 40;
APPCOMMAND_SEND_MAIL = 41;
APPCOMMAND_SPELL_CHECK = 42;
APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE = 43;
APPCOMMAND_MIC_ON_OFF_TOGGLE = 44;
APPCOMMAND_CORRECTION_LIST = 45;
APPCOMMAND_MEDIA_PLAY = 46;
APPCOMMAND_MEDIA_PAUSE = 47;
APPCOMMAND_MEDIA_RECORD = 48;
APPCOMMAND_MEDIA_FAST_FORWARD = 49;
APPCOMMAND_MEDIA_REWIND = 50;
APPCOMMAND_MEDIA_CHANNEL_UP = 51;
APPCOMMAND_MEDIA_CHANNEL_DOWN = 52;
// KeyState bit values
MK_LBUTTON = $0001;
MK_RBUTTON = $0002;
MK_SHIFT = $0004;
MK_CONTROL = $0008;
MK_MBUTTON = $0010;
MK_XBUTTON1 = $0020;
MK_XBUTTON2 = $0040;
type
// source of app command
TJvAppCommandDevice = (acdKey, acdMouse, acdOEM);
TJvAppCommandEvent = procedure(Handle: THandle;
Cmd: WORD; Device: TJvAppCommandDevice; KeyState: WORD;
var Handled: Boolean) of object;
TJvAppCommand = class(TJvComponent)
private
FActive: Boolean;
FOnAppCommand: TJvAppCommandEvent;
FForm: TCustomForm;
procedure SetActive(Value: Boolean);
function NewWndProc(var Msg: TMessage): Boolean;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Active: Boolean read FActive write SetActive default True;
property OnAppCommand: TJvAppCommandEvent read FOnAppCommand write FOnAppCommand;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_39/run/JvAppCommand.pas $';
Revision: '$Revision: 12461 $';
Date: '$Date: 2009-08-14 19:21:33 +0200 (ven., 14 août 2009) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
// Required for outside use (see the MegaDemo for instance)
function GET_APPCOMMAND_LPARAM(lParam: LPARAM): WORD;
function GET_DEVICE_LPARAM(lParam: LPARAM): WORD;
function GET_KEYSTATE_LPARAM(lParam: LPARAM): WORD;
implementation
uses
JvWndProcHook;
const
// from JwaWinUser.pas
FAPPCOMMAND_MOUSE = $8000;
FAPPCOMMAND_KEY = 0;
FAPPCOMMAND_OEM = $1000;
FAPPCOMMAND_MASK = $F000;
function GET_APPCOMMAND_LPARAM(lParam: LPARAM): WORD;
begin
Result := WORD(HIWORD(lParam) and not FAPPCOMMAND_MASK);
end;
function GET_DEVICE_LPARAM(lParam: LPARAM): WORD;
begin
Result := WORD(HIWORD(lParam) and FAPPCOMMAND_MASK);
end;
function GET_KEYSTATE_LPARAM(lParam: LPARAM): WORD;
begin
Result := LOWORD(lParam);
end;
//=== { TJvAppCommand } ======================================================
constructor TJvAppCommand.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FForm := GetParentForm(TControl(AOwner));
Active := True;
end;
destructor TJvAppCommand.Destroy;
begin
Active := False;
inherited Destroy;
end;
procedure TJvAppCommand.SetActive(Value: Boolean);
begin
if FActive <> Value then
begin
FActive := Value;
if (FForm <> nil) and not (csDesigning in ComponentState) then
if Value then
RegisterWndProcHook(FForm, NewWndProc, hoBeforeMsg)
else
UnregisterWndProcHook(FForm, NewWndProc, hoBeforeMsg);
end;
end;
function TJvAppCommand.NewWndProc(var Msg: TMessage): Boolean;
var
Dev: TJvAppCommandDevice;
begin
Result := False;
if (Msg.Msg = WM_APPCOMMAND) and Active then
begin
Msg.Result := 1;
Result := True;
if Assigned(FOnAppCommand) then
begin
case GET_DEVICE_LPARAM(Msg.LParam) of
FAPPCOMMAND_MOUSE:
Dev := acdMouse;
FAPPCOMMAND_OEM:
Dev := acdOEM;
else
Dev := acdKey;
end;
FOnAppCommand(THandle(Msg.WParam), GET_APPCOMMAND_LPARAM(Msg.LParam),
Dev, GET_KEYSTATE_LPARAM(Msg.LParam), Result);
Msg.Result := Ord(Result);
end;
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.