重复该功能,直到释放 CTRL 按钮

问题描述 投票:0回答:1

我需要一个代码,当我按住键盘上的 ctrl 按钮时,它将不断地按下向上箭头按钮 - 模拟 ctrl (按下直到我释放它)+向上箭头。 到目前为止我得到的代码:

function LowLevelKeybdHookProc(nCode, wParam, lParam : integer) : integer; stdcall;
var
  info : ^KeybdLLHookStruct absolute lParam;
  lpChar : word;
  kState : TKeyboardState;
  s:string;
  i:integer;
  inputArray: array[0..3] of TInput;
begin
result := CallNextHookEx(kHook, nCode, wParam, lParam);



with info^ do

case wParam of
  wm_keydown : begin

    GetKeyboardState(kState);


  if  GetKeyState(VK_CONTROL) = 0  then

  begin
  inputArray[0].Itype := INPUT_KEYBOARD;
  inputArray[0].ki.wVk := VK_UP;
  inputArray[1].Itype := INPUT_KEYBOARD;
  inputArray[1].ki.wVk := VK_UP;
  inputArray[1].ki.dwFlags := KEYEVENTF_KEYUP;


  SendInput(length(inputArray), inputArray[0], sizeof(TInput));
  end;

end;
end;
end;

我尝试自己制作,但有些东西无法正常工作 - 就像一个奇怪的鼠标和键盘故障,它使箭头按钮,有时甚至鼠标右键单击保持按下状态,并且只有在单击 ctrl+alt+delete 时才能修复。我将不胜感激任何帮助。 谢谢你。

delphi lazarus
1个回答
0
投票

代码的修订版本:

function LowLevelKeybdHookProc(nCode, wParam, lParam: Integer): Integer; stdcall;
var
  info: ^KeybdLLHookStruct absolute lParam;
  inputArray: array[0..1] of TInput;
begin
  Result := CallNextHookEx(kHook, nCode, wParam, lParam);

  if nCode < 0 then Exit;

  with info^ do
  begin
    if wParam = WM_KEYDOWN then
    begin
      if (vkCode = VK_CONTROL) and ((GetKeyState(VK_UP) and $8000) <> 0) then
      begin
        inputArray[0].Itype := INPUT_KEYBOARD;
        inputArray[0].ki.wVk := VK_UP;
        inputArray[1].Itype := INPUT_KEYBOARD;
        inputArray[1].ki.wVk := VK_UP;
        inputArray[1].ki.dwFlags := KEYEVENTF_KEYUP;

        SendInput(Length(inputArray), inputArray[0], SizeOf(TInput));
      end;
    end;
  end;
end;
© www.soinside.com 2019 - 2024. All rights reserved.