我急用一段代码
按下任意键执行一个操作1,再按下任意键,执行操作2,再按下任意键,又执行操作1,如此循环
不知是用hook来做,还是有其它的办法/?
 

解决方案 »

  1.   

    var
      Form1: TForm1;
      FirstOperation:boolean=true;
    implementation{$R *.dfm}procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if FirstOperation then
       showmessage('执行操作1')
       else
       showmessage('执行操作2');
    FirstOperation:=not FirstOperation;
    end;
      

  2.   

    FirstOperation:boolean=true; 
    这是什么意思?
      

  3.   

    FirstOperation 只是一个标志位,按过1后,切换标志来达到循环操作,如果FirstOperation 是integer类型或string,你还能做 操作1->操作2——>操作3->操作1的循环,甚至更多。
      

  4.   

    这儿有个键盘钩子的示例代码,你看看吧
    http://hi.baidu.com/83925com/blog/item/3c60865cffb76046fbf2c0bb.html
      

  5.   

    给你简化一下,改成你需要的unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
    TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
    private
    { Private declarations }
        procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;
    public
    { Public declarations }
    end;const
    KeyMask = $80000000;
    var
    Form1: TForm1;
    FirstOperation:boolean=true;
    LogHook: HHook = 0;
    LastFocusWnd: HWnd = 0;
    PrvChar: Char;
    HotKeyId: Integer;
    implementation{$R *.dfm}function LogProc(iCode: Integer; wparam, lparam: LongInt): lresult; stdcall;
    var
    ch: Char;
    vKey: Integer;
    PEvt: ^EVENTMSG;
    begin
    if iCode < 0 then
    begin
        Result := CallNextHookEx(LogHook, iCode, wParam, lParam);
        exit;
    end;if (iCode = HC_ACTION) then
    begin
        pEvt := Pointer(DWord(lParam)); //消息事件    if pEvt.message = WM_KEYDOWN then
        begin
          if FirstOperation then
             form1.Memo1.Lines.Add('执行操作1')
          else
             form1.Memo1.Lines.Add('执行操作2');
          FirstOperation:=not FirstOperation;
        end; fsdsfsdasfd
    end;Result := CallNextHookEx(LogHook, iCode, wParam, lParam);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    HotKeyId := GlobalAddAtom('MyHotKey') - $C000;
    RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);
    //
    if LogHook = 0 then
        LogHook := SetWindowsHookEx(WH_JOURNALRECORD, LogProc, HInstance, 0);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    if LogHook <> 0 then
    begin
        UnhookWindowsHookEx(LogHook);
        LogHook := 0;
    end;
    end;
    procedure TForm1.HotKeyDown(var Msg: Tmessage);
    begin
    if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F8) then
    begin
        showmessage('ALT' + 'F8');
        form1.Visible := true;
    end;
    end;end.
      

  6.   

    不用把,加个全局boolean变量
    按下按键先读取boolean变量的值如果是真就执行第一个函数功能
    如果是假就执行第二个函数功能,
    然后将boolean 变量取反,
    很简单,用什么钩子啊
      

  7.   

    如钩f9键,只要判断它,F9键= VK_F9 (120)
    就行了.
      

  8.   

    要这么复杂做什么啊 ,做一个 标志,在KEYPRESS里,执行了事件1就打上一个标记,执行了事件2就更新另一个标记,执行事件时只要根据当前的 标记判断就知道该执行哪个事件了啊 
      

  9.   

    hook的问题,解决了,可这段代码,调用达不到我的目地,不知是怎么回事?
    unit funVolume;interfaceuses MMSystem, Dialogs;Type TDeviceName = (Master, Microphone, WaveOut, Synth);function GetVolume(DN:TDeviceName) : Word ;
    procedure SetVolume(DN:TDeviceName; Value:Word);
    function GetVolumeMute(DN:TDeviceName) : Boolean;
    procedure SetVolumeMute(DN:TDeviceName; Value:Boolean);implementation//获取音量
    function GetVolume(DN:TDeviceName) : Word;
    var
    hMix: HMIXER;
    mxlc: MIXERLINECONTROLS;
    mxcd: TMIXERCONTROLDETAILS;
    vol: TMIXERCONTROLDETAILS_UNSIGNED;
    mxc: MIXERCONTROL;
    mxl: TMixerLine;
    intRet: Integer;
    nMixerDevs: Integer;
    begin
    // Check if Mixer is available
    nMixerDevs := mixerGetNumDevs();
    if (nMixerDevs < 1) then
    begin
       Exit;
    end;// open the mixer
    intRet := mixerOpen(@hMix, 0, 0, 0, 0);
    if intRet = MMSYSERR_NOERROR then
    begin
       case DN of
         Master : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
         Microphone :
                 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
         WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
         Synth : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
       end;
       mxl.cbStruct := SizeOf(mxl);   // get line info
       intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);   if intRet = MMSYSERR_NOERROR then
       begin
         FillChar(mxlc, SizeOf(mxlc),0);
         mxlc.cbStruct := SizeOf(mxlc);
         mxlc.dwLineID := mxl.dwLineID;
         mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);     mxlc.pamxctrl := @mxc;
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cbStruct := SizeOf(mxcd);
           mxcd.cMultipleItems := 0;
           mxcd.cbDetails := SizeOf(Vol);
           mxcd.paDetails := @vol;
           mxcd.cChannels := 1;       intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);       Result := vol.dwValue ;       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('GetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;
       intRet := mixerClose(hMix);
    end;
    end;//设置音量
    procedure setVolume(DN:TDeviceName; Value : Word);
    var
    hMix: HMIXER;
    mxlc: MIXERLINECONTROLS;
    mxcd: TMIXERCONTROLDETAILS;
    vol: TMIXERCONTROLDETAILS_UNSIGNED;
    mxc: MIXERCONTROL;
    mxl: TMixerLine;
    intRet: Integer;
    nMixerDevs: Integer;
    begin
    // Check if Mixer is available
    nMixerDevs := mixerGetNumDevs();
    if (nMixerDevs < 1) then
    begin
       Exit;
    end;// open the mixer
    intRet := mixerOpen(@hMix, 0, 0, 0, 0);
    if intRet = MMSYSERR_NOERROR then
    begin
       case DN of
         Master : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
         Microphone :
                 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
         WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
         Synth : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
       end;
       mxl.cbStruct := SizeOf(mxl);   // get line info
       intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);   if intRet = MMSYSERR_NOERROR then
       begin
         FillChar(mxlc, SizeOf(mxlc),0);
         mxlc.cbStruct := SizeOf(mxlc);
         mxlc.dwLineID := mxl.dwLineID;
         mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);     mxlc.pamxctrl := @mxc;
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cbStruct := SizeOf(mxcd);
           mxcd.cMultipleItems := 0;
           mxcd.cbDetails := SizeOf(Vol);
           mxcd.paDetails := @vol;
           mxcd.cChannels := 1;       vol.dwValue := Value;       intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('SetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;
       intRet := mixerClose(hMix);
    end;
    end;我的调用代码
     if p^.vkCode = 120 then y:=1;
            begin
             Vol := GetVolume(Master);
              setVolume(Master,15530);
              end;
    我想达到每按下f9键,就能增加15530的音量,可第一次似乎增加了,第二次按就没有反映了?
    不知道是代码的问题,还是我调用的问题?
      

  10.   

    hook的问题,解决了,可这段代码,调用达不到我的目地,不知是怎么回事?
    unit funVolume;interfaceuses MMSystem, Dialogs;Type TDeviceName = (Master, Microphone, WaveOut, Synth);function GetVolume(DN:TDeviceName) : Word ;
    procedure SetVolume(DN:TDeviceName; Value:Word);
    function GetVolumeMute(DN:TDeviceName) : Boolean;
    procedure SetVolumeMute(DN:TDeviceName; Value:Boolean);implementation//获取音量
    function GetVolume(DN:TDeviceName) : Word;
    var
    hMix: HMIXER;
    mxlc: MIXERLINECONTROLS;
    mxcd: TMIXERCONTROLDETAILS;
    vol: TMIXERCONTROLDETAILS_UNSIGNED;
    mxc: MIXERCONTROL;
    mxl: TMixerLine;
    intRet: Integer;
    nMixerDevs: Integer;
    begin
    // Check if Mixer is available
    nMixerDevs := mixerGetNumDevs();
    if (nMixerDevs < 1) then
    begin
       Exit;
    end;// open the mixer
    intRet := mixerOpen(@hMix, 0, 0, 0, 0);
    if intRet = MMSYSERR_NOERROR then
    begin
       case DN of
         Master : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
         Microphone :
                 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
         WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
         Synth : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
       end;
       mxl.cbStruct := SizeOf(mxl);   // get line info
       intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);   if intRet = MMSYSERR_NOERROR then
       begin
         FillChar(mxlc, SizeOf(mxlc),0);
         mxlc.cbStruct := SizeOf(mxlc);
         mxlc.dwLineID := mxl.dwLineID;
         mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);     mxlc.pamxctrl := @mxc;
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cbStruct := SizeOf(mxcd);
           mxcd.cMultipleItems := 0;
           mxcd.cbDetails := SizeOf(Vol);
           mxcd.paDetails := @vol;
           mxcd.cChannels := 1;       intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);       Result := vol.dwValue ;       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('GetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;
       intRet := mixerClose(hMix);
    end;
    end;//设置音量
    procedure setVolume(DN:TDeviceName; Value : Word);
    var
    hMix: HMIXER;
    mxlc: MIXERLINECONTROLS;
    mxcd: TMIXERCONTROLDETAILS;
    vol: TMIXERCONTROLDETAILS_UNSIGNED;
    mxc: MIXERCONTROL;
    mxl: TMixerLine;
    intRet: Integer;
    nMixerDevs: Integer;
    begin
    // Check if Mixer is available
    nMixerDevs := mixerGetNumDevs();
    if (nMixerDevs < 1) then
    begin
       Exit;
    end;// open the mixer
    intRet := mixerOpen(@hMix, 0, 0, 0, 0);
    if intRet = MMSYSERR_NOERROR then
    begin
       case DN of
         Master : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
         Microphone :
                 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
         WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
         Synth : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
       end;
       mxl.cbStruct := SizeOf(mxl);   // get line info
       intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);   if intRet = MMSYSERR_NOERROR then
       begin
         FillChar(mxlc, SizeOf(mxlc),0);
         mxlc.cbStruct := SizeOf(mxlc);
         mxlc.dwLineID := mxl.dwLineID;
         mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);     mxlc.pamxctrl := @mxc;
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cbStruct := SizeOf(mxcd);
           mxcd.cMultipleItems := 0;
           mxcd.cbDetails := SizeOf(Vol);
           mxcd.paDetails := @vol;
           mxcd.cChannels := 1;       vol.dwValue := Value;       intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('SetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;
       intRet := mixerClose(hMix);
    end;
    end;我的调用代码
     if p^.vkCode = 120 then y:=1;
            begin
             Vol := GetVolume(Master);
              setVolume(Master,15530);
              end;
    我想达到每按下f9键,就能增加15530的音量,可第一次似乎增加了,第二次按就没有反映了?
    不知道是代码的问题,还是我调用的问题?