2010-12-07 2 views
0

예전에 사용자가 일부 단축키를 누르면 모든 응용 프로그램의 입력 필드에 선택된 텍스트를 둘러싸고있는 간단한 응용 프로그램을 유니 코드 기호로 둘러 쌌습니다. . 기본적으로 앱의 로직은 다음과 같습니다 :입력 대기열을 사용하지 않고 다른 응용 프로그램에서 클립 보드 복사/붙여 넣기 작업을 올바르게 호출하는 방법

  • 글로벌 단축키 등록.
  • 핫키가 실행되었습니다. 이제 클립 보드 모니터를 설정하고 클립 보드 복사를 호출하여 텍스트가 선택되었는지 확인하십시오.
  • 클립 보드가 변경되어 텍스트가 포함 된 경우 해당 텍스트를 기호로 묶은 다음 클립 보드 붙여 넣기를 호출하므로 입력 필드가 수정 된 텍스트로 업데이트됩니다.

문제는 신뢰할 수있는 방법으로 다른 앱에서 복사/붙여 넣기 기능을 사용할 수 없다는 것입니다. 내가 시도한 :

  1. WM_COPY/WM_PASTE를 보내면 응용 프로그램에 따라 그렇지 않은 것보다 더 자주 무시됩니다.
  2. SendInput, keybd_event 또는 다른 키보드를 쓰는 물건을 사용하여 일반적인 클립 보드 바로 가기 키를 누르거나 언 프레스하면 사용자가 누른 키를 조작하지 못하게됩니다. 복사/붙여 넣기는 컨트롤이나 쉬프트를 사용하며 모든 일반 모든 앱의 단축키, 내 앱이 포함되어 있습니다.
  3. 필자가 Journal Hook을 사용하여 키보드 메시지를 시스템 입력 대기열에 직접 주입하는 경우 가끔 제대로 작동하고 이상한 글리치가 발생할 수 있습니다. 또한, 다른 응용 프로그램이 JournalHook을 자체적으로 사용하고있을 수 있으며, 이로 인해 내 앱이 엉망이 될 수 있습니다. 언급하지 않아도 기본 보안 정책은 저널을 사용하기가 어렵습니다.
  4. 나는 클립 보드 매직 대신 Windows UI 자동화를 사용하여 입력 필드에 텍스트를 가져 오거나 설정하려했지만 거의 작동하지 않습니다. 다른 응용 프로그램이 안정적으로 복사/붙여 넣기 기능을 사용, 또는 완전히 다른 접근 방식을 고안 할 수 있도록 다른 방법을 알고있는 경우

그래서, 난 정말 당신이 말해 감사하겠습니다 :)

답변

0

오, 그게 내가 더 많은 또는 덜 SendInput 또는 저널 후크없이 복사 붙여 넣기를 호출하는 방법을 찾을 수있을 것 같아요,하지만 나는 그것을 처리해야합니다 :-) 그래서, 여기에, 누군가가 유용하다고 생각하면 :

  1. 기억하고 AttachThreadInput (yourAppThreadId, targetAppThreadId) + SetKeyboardState (keyStateWithoutKeyboardModifiers)를 통해 키보드 수식을 다시 설정합니다.
  2. Ctrl + C/V 단축키의 SetKeyboardState (keyStateWithControl)를 통해 Ctrl 키 수정자를 설정하십시오.
  3. 그런 다음 PostMessage에 초점을 맞춘 컨트롤에 C 또는 V 키에 대한 WM_KEYDOWN 메시지와 함께 복사 또는 붙여 넣기를 수행할지 여부를 지정합니다.
  4. 다른 응용 프로그램이 메시지를 처리하도록 Thread.CurrentThread.Join (20)을 호출하십시오. 다른 응용 프로그램이 빈 메시지 대기열을 가질 때를 알 수있는 확실한 방법을 찾을 수 없기 때문에 전체 트랜잭션에서 가장 지체 된 순간입니다.
  5. 기억 된 키보드 수정자를 복원하십시오.

또한 SetKeyboardState를 수행 할 때마다 SetForegroundWindow (focusedControlHandle) 및 SetFocus (focusedControlHandle)를 나중에 호출하십시오.

0

내가 당신의 접근 방식 생각 그렇게 나쁘지는 않습니다, 아마도 당신은 클립 보드를 모니터링 할 수 있도록 WM_DRAWCLIPBOARD로 시작할 수 있습니다. 좋은 샘플 코드는 here입니다.
다음 : SendKeys class -주의 : Flush, Buffer, 등등. 이것을 사용하여 windows 메시지 대신 ctrl + c/v를 보내십시오! 모니터가 작동하면 알림을 받아야합니다.
이제 Cliboard class을 사용하여 데이터를 조작하고 다시 붙여 넣습니다.

+0

감사합니다. 클립 보드에서 GetClipboardSequenceNumber 폴링을 사용하여 변경 사항을 테스트합니다. 클립 보드를 조작하는 것은 어렵지 않습니다. 제가이 물건을 쓴 가장 큰 이유는 입력 대기열에 간섭하는 모든 방법에 대한 해킹입니다. Ctrl + C를 다른 응용 프로그램에 쉽게 보낼 수는 있지만 사용자가 Shift + somekey를 동시에 누르면 Ctrl + C가 작동하도록 로컬 스레드 입력 대기열에서 시프트를 제거해야합니다. 대기열에 있습니다. 사용자가 실제로 이러한 작업 사이에서 Shift 키를 누르면 고정 키가 생깁니다. Journal Hook을 사용하는 주된 이유입니다. – EnoughTea

관련 문제