프로그래밍/델파이

델파이 코딩 팁

do121 2023. 5. 31. 06:09

1. popup menu 단축키 없애기

  autohotkeys 속성을 mamanual로 변경

 

2. menu 항목의 캡션에 붙은 '&' 만 제거한 텍스트 얻기

  striphotkey함수를 사용하면 '&'를 제거한 텍스트만 가져옴

https://delphi.cjcsoft.net/viewthread.php?tid=43051 

 

Remove Automatic Accelerator Keys For Delphi Menu Item - Remove Auto "&" in Item's Caption - Delphi Tips - CJC Delphi (Cool Del

 

delphi.cjcsoft.net

3. 키보드 후킹하기

 WParam = WM_KEYDOWN 조건을 추가하면 누를 때만 키입력을 가로챌수 있음 

  private
    FHookHandle: HHOOK;
    FInputString: string;

const

  HOTKEY_MODIFIERS = MOD_CONTROL;
  HOTKEY_KEY = Ord('1');

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FHookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, @HandleKeyboardHook, HInstance, 0);

end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  UnhookWindowsHookEx(FHookHandle);
end;

procedure TMainForm.HandleKeyboardHook(Code: Integer; wParam: WPARAM; lParam: LPARAM);
var
  keyboardHookStruct: PKBDLLHOOKSTRUCT;
  input: array [0..1] of TInput;
  i: Integer;
begin
  if Code = HC_ACTION then
  begin
    keyboardHookStruct := PKBDLLHOOKSTRUCT(lParam);
    if (keyboardHookStruct^.vkCode = HOTKEY_KEY) and
       ((keyboardHookStruct^.flags and LLKHF_ALTDOWN) = 0) and
       ((keyboardHookStruct^.flags and LLKHF_EXTENDED) = 0) and
       (GetAsyncKeyState(VK_CONTROL) < 0) then
    begin
      if IsActiveExcelWindow then
      begin
        // 엑셀이 활성화되어 있는 경우에만 핫키 동작 수행
        for i := 0 to Length(FInputString) - 1 do
        begin
          input[i].Itype := INPUT_KEYBOARD;
          input[i].ki.wVk := 0;
          input[i].ki.wScan := Ord(FInputString[i+1]);
          input[i].ki.dwFlags := KEYEVENTF_UNICODE;
          input[i].ki.time := 0;
          input[i].ki.dwExtraInfo := 0;
        end;

        // 문자열 입력
        SendInput(Length(FInputString), input[0], SizeOf(TInput));
      end;
    end;
  end;

  // 후킹된 메시지 처리 계속 진행
  Result := CallNextHookEx(FHookHandle, Code, wParam, lParam);
end;

function TMainForm.IsActiveExcelWindow: Boolean;
var
  Excel: TExcelApplication;
begin
  Result := False;
  try
    Excel := TExcelApplication.Create(nil);
    Result := Excel.Connected;
    Excel.Free;
  except
    Result := False;
  end;
end;

 

 

4. MSScriptControl 설치하기

import activex에서 MSScriptControl 선택 후 install 클릭