2009-10-10 13 views
3

시험에서 부정 행위에 대해 좋은 생각이 있습니다. 내 학교는 아주 오래된 IDE의 (생각 터보 파스칼, 터보 C++ 및 기타 (80)의 것)을 사용하고, 내가하고 싶은 것은 이것이다 :일부 키 누르기를 다른 키 누르기로 변환하려면 어떻게해야합니까?

  • 백그라운드에서 내 프로그램을 시작

  • keypresses를 가로 챈 다음 화면에 직접 보내지 않고 미리 구성된 텍스트 파일에서 문자를 읽고 누른 키로 보내고 싶습니다. 이 방법을 쓰면 무엇이든 상관없이 해당 파일의 텍스트가 화면에 표시됩니다.

나는 로깅 키에 대한 Stephen Toub's 기사를 발견하고, 나는이 " tool"을 구축에 좋은 시작이 될 것이라 생각합니다. SetWindowsHookEx보다 시스템에서 눌러 진 모든 키를 가로 채기위한 더 좋은 대안이 있습니까? 의심스러운 프로그램으로 바이러스 백신에 의해 코드에 플래그가 지정됩니까? 그렇다면 바이러스 백신으로 신고하지 않고이 작업을 수행하는 데 사용할 수있는 다른 방법이 있습니까? 관리자 권한이 필요합니까?

여러분 중 일부는 말할 것입니다. 학습을 피하는 것과 마찬가지로 학습에 많은 관심을 기울이면 좋지만,이 문제를 해결하고 싶습니다.

EDIT : 저는 현상금을 추가했습니다. 키 스트로크 캡처에 대한 몇 가지 기술에 관심이 있습니다 (저급 후킹이나 고급 기능에는 관심이 없습니다 - 기본 사항은 괜찮습니다), 주로 메소드 이름과 일부 링크 문서화. 나는 또한 그들이 안티 바이러스에 악성 코드로 나타나는지 알고 싶습니다.

+5

글쎄, 당신은 분명히 당신의 의도에 대해 솔직합니다. 내가 그걸 줄께. –

+0

왜 속임수? 당신이 사실에 있다는 사실과 당신이 가진 대표자가 무효가됩니다. – aviraldg

+1

선생님이 그녀가하는 말에 대한 단서가 없기 때문에 나는 속임수를 쓰고 싶습니다. 그녀는 약 20 년 전에 가르치고있는 내용을 배웠고 주어진 작업에 대한 다른 대안을 받아들이지 않을 것입니다. 그녀의 것만. 단어 단어별로. – Geo

답변

2

GOD! 난 그냥 ..이 다른 일을위한 완벽한 클래스를 발견 원본 찾을 걸 렸어요했습니다 http://www.codeproject.com/KB/cs/globalhook.aspx

내가이 (그리고 SendKeys 매크로)를 사용 정확히 당신이 필요 혼자를, 당신 ' 원래 키 메시지를 차단하려면 Handle = true를 사용해야합니다.

SendKeys는 좀 못생긴 ... 당신이 원할 경우 대체품을 찾을 수 있지만 SendKeys가 효과적입니다. 실제로 또한 창에 초점이 무엇인지 prccess '결정에이 방법을 사용

private void HookManager_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.D){ 
      e.Handled = true; 
      SendKeys.Send("F"); 
     } 
    } 

, 그래서 당신은 다른 응용 프로그램에있는 경우 응용 프로그램은 아무것도 할 것입니다 : SendKeys 매크로와

는 뭔가처럼

/// <summary> 
    /// The GetForegroundWindow function returns a handle to the foreground window. 
    /// </summary> 
    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

    static bool IsProcessFocused(string processname) 
    { 
     if (processname == null || processname.Length == 0) 
     { 
      throw new ArgumentNullException("processname"); 
     } 

     Process[] runninProcesses = Process.GetProcessesByName(processname); 
     IntPtr activeWindowHandle = GetForegroundWindow(); 

     foreach (Process process in runninProcesses) 
     { 
      if (process.MainWindowHandle.Equals(activeWindowHandle)) 
      { 
       return true; 
      } 
     } 

     // Process was not found or didn't had the focus. 
     return false; 
    } 
+0

제공된 링크 대단 했어! 내 요구 사항에 완벽하게 부합한다고 생각합니다. 감사합니다! – Geo

2

SetWindowsHookEx가 가장 좋습니다. 일부 바이러스 백신 프로그램에서 플래그를 지정하겠다고 들었지만 한 번 사용한 작은 응용 프로그램을 만들고 바이러스 경고를 반환하지 않은 AVG로 검사했습니다.

1

필자가 말할 수있는 한, 가장 신뢰할 수있는 방법은 시스템 전체 인터럽트 (INT17h라고 생각합니까?)를 설정하는 것입니다.하지만 게시물이 C#으로 태그 된 것을 고려하면 꽤 낮은 수준입니다. 관련 도구를 찾으십시오. 많은 도구를 찾으십시오.

+0

http://www.codeproject.com/KB/system/KeyHook.aspx 도움을 받아야한다고 생각합니다 – aviraldg

2

부정 행위는 좋지만, 귀하의 탄원을 이해합니다. 나는 닷넷 API가 당신이 원하는 것을위한 방법을 싸웠다 고 생각하지 않기 때문에 API 훅에 빠지지 않고 가능하다고 생각하지 않는다.

완성도를 들어

, 그냥 몇 가지 세부 사항 추가 할 수 있습니다 :

불행하게도 당신이 들어갈 필요를 WIN32 API의 : http://msdn.microsoft.com/en-us/library/ms645530(VS.85).aspx

WM_SYSKEYDOWN 통지가 키 스트로크를 얻기 위해 사용할 수 있지만이 소요 핸들을 사용하여 모니터링 할 창 핸들을 가져 오는 * GetWindow ** API가 필요합니다.

키 스트로크를 시뮬레이션하거나 SendInput을keybd_event에게 [http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx] 기능을보십시오.

Google "WIN API 뷰어"는 API를 쉽게 검색하고 볼 수있는 유틸리티로, .Net 코드도 있습니다.

많은 시행 착오를 거치는 것들 중 하나이며, 나는 당신에게 좀 더 확실한 대답을 원합니다.