2010-06-22 4 views
3

가상 컴퓨터 (XP SP3/.NET3.5/VS 2008)로 프로그래밍 방식으로 RDP (자격 증명이 .rdp 파일에 저장 됨) 및 UI 자동화 테스트를 수행해야합니다. 도메인 보안 때문에 대화 형 로그온에 프로그래밍 방식으로 '확인'해야합니다. 로그인 후에 다른 대화 창 및 SendMessages에 액세스 할 수 있지만이 초기 화면에서 SendMessage를 사용할 수 없습니다. 나는 spy ++를 사용하여 enter 키를 누를 때 실제로 무엇이 보내지는지 파악하고 내 프로그램을 실행할 때 spy ++ 로그의 응답을 볼 때 해당 메시지를 복제 할 수있는 것처럼 보이지만 메시지에서 어떤 변형이 사용 되더라도 아무 일도 일어나지 않습니다 . 프로그래밍 방식으로이를 수행 할 수 있는지 또는 OS가 보안 문제로 인해 이런 종류의 자동화를 방지하는지 알고 싶습니다.프로그래밍 방식의 RDP 로그인 및 SendMessage

WM_KEYDOWN nVirtKey:00FF cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 Up:0 
WM_KEYUP nVirtKey:00FF cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 Up:1 

나는 아래의 코드를 행사하고 보내는 메시지를 볼 때 :

내가 입력 버튼을 쳤을 때 나는 ++ 스파이에 표시되는 메시지 나는 볼 (즉, 초기 화면에 아무 키나 할 것 같다) IHWindowClass (아래 hwnd6) 나는 그 창에 위 메시지를 생성하는 것을 본다. 어떤 도움을 주시면 감사하겠습니다! 여기

코드의 관련 부분은 다음과 같습니다

'UIntPtr ip = new UIntPtr(0x0D); //ENTER 
UIntPtr ip2 = new UIntPtr(0xFF); //00FF 
UIntPtr kyDwnlParam = new UIntPtr(0x001); 
UIntPtr kyUplParam = new UIntPtr(0xc0000001); 

// used UISpy to get these class names... 
string lpszParentClass = "TscShellContainerClass"; 
string lpszParentWindow = "test2 - test2 - Remote Desktop Connection"; 
string lpszClass2 = "TscShellAxHostClass"; 
string lpszClass3 = "ATL:2D33D580"; 
string lpszClass4 = "UIMainClass"; 
string lpszClass5 = "UIContainerClass"; 
string lpszClass6 = "IHWindowClass"; 


hWnd2 = FindWindowEx(ParenthWnd, IntPtr.Zero, lpszClass2, IntPtr.Zero); 
hWnd3 = FindWindowEx(hWnd2, IntPtr.Zero, lpszClass3, IntPtr.Zero); 
hWnd4 = FindWindowEx(hWnd3, IntPtr.Zero, lpszClass4, IntPtr.Zero); 
hWnd5 = FindWindowEx(hWnd4, IntPtr.Zero, lpszClass5, IntPtr.Zero); 
hWnd6 = FindWindowEx(hWnd5, IntPtr.Zero, lpszClass6, IntPtr.Zero); 

string hexValue = hWnd6.ToString("X"); //Convert to hex to use find in spy++ 

SetForegroundWindow(hWnd6); // for good measure.... 

// tried this.... 

SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_KEYDOWN, ip2, kyDwnlParam); 
SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_KEYUP, ip2, kyUplParam); 

// tried this.... 

SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_KEYDOWN, ip, kyDwnlParam); 
SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_KEYUP, ip, kyUplParam); 

// tried this... 
SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_CHAR, ip, UIntPtr.Zero); 
SendMessage(hWnd6, (uint)WindowsUtilities.WindowsMessages.WM_CHAR, ip, UIntPtr.Zero);' 

답변

0

당신은 키보드 입력을 받아 들일 준비가 RDP 세션을 얻을 보내야 다른 메시지의 몇 가지 있습니다 거의있다. Spy ++를 사용하면 더 많은 메시지를보아야합니다.

내가 편지를 얻을 수 있었다 '는'아래의 코드를 메모장 창에 입력 (또는 이론적으로 이제까지 RDP 세션에서 활성 창은 무엇인가) :

SendMessage(cWind, (int)WM.IME_SETCONTEXT, new UIntPtr(0x00000001), new UIntPtr(0xC000000F)); 
SendMessage(cWind, (int)WM.IME_NOTIFY, new IntPtr(0x00000002), new IntPtr(0x00000000)); 
Thread.Sleep(1); 

SendMessage(cWind, (int)WM.SETFOCUS, new UIntPtr(0x00203794), new UIntPtr(0x00000000)); 
Thread.Sleep(1); 
//Random keypress 
SendMessage(cWind, (int)WM.KEYDOWN, new UIntPtr(0x000000FF), new UIntPtr(0x00000001)); 
SendMessage(cWind, (int)WM.KEYUP, new UIntPtr(0x00000041), new UIntPtr(0xC0000001)); 
Thread.Sleep(1); 
//A key presses 
SendMessage(cWind, (int)WM.KEYDOWN, new IntPtr(0x00000041), new IntPtr(0x001E0001)); 
SendMessage(cWind, (int)WM.KEYUP, new UIntPtr(0x00000041), new UIntPtr(0xC01E0001)); 

잠들지 수도 있고 필요할지도 모르지만, Spy ++는 전화가 돌아 왔음을 알려주기 때문에 계속하기 전에 잠시 기다립니다. 아마 setfocus/setcontext 작업을 "실행 취소"해야하지만, 내 필요에 따라이 작업이 정상적으로 수행되었습니다. (Spy ++가 세부 정보를 표시합니다)

0

@Spike에 따르면 IME_SETCONTEXT 및 IME_NOTIFY를 전송해야합니다. 코드를 테스트 한 결과 입력을 가져 왔지만 VK_A - VK_Z를 보내더라도 'a'문자 만 전송합니다.

   SendMessageKey.SimulateKey.SendMessage((IntPtr)hwnd, SendMessageKey.MessageCode.WM_IME_SETCONTEXT, 0x00000001, 0xc000000f); 
       SendMessageKey.SimulateKey.SendMessage((IntPtr)hwnd, SendMessageKey.MessageCode.WM_IME_NOTIFY, 0x00000002, 0x00000000); 
       SendMessageKey.SimulateKey.SendMessage((IntPtr)hwnd, SendMessageKey.MessageCode.WM_SETFOCUS, 0x00000000, 0x00000000); 

는 VK_A를 보내기 전에 (예를 들어), Winspector는 내가 미안 해요, 여기 붙어있어 255의 알 수없는 값/키 코드와 WM_KEYDOWN + WM_KEYUP를 감지합니다. 어쩌면 당신은 틀린 것을 발견 할 것이다.

관련 문제