2011-12-22 1 views
2

Office Outlook Interop (2010; 버전 14)를 사용하여 MAPI를 통해 전자 메일 데이터에 액세스하는 C#으로 응용 프로그램을 작성했습니다.SendMessage를 사용하여 '프로그램이 전자 메일에 액세스하려고합니다'를 패배

은 지금까지 수동으로 반복 Outlook의에서 허용을 클릭해야합니다 (http://i.stack.imgur.com/gj8to.png에서 스크린 샷) 보안 팝업 "프로그램 전망에 저장된 전자 메일 주소 정보에 액세스하기 위해 노력하고있다".

클릭을 자동으로 수행하는 방법을 쓰려고했지만 실패했습니다. 딸깍이 발생하지만, 아웃룩 상호 운용성은 다음 읽기 작업을 수행하는 동안 다음과 같은 예외가 발생합니다 : HRESULT에서

예외 : 0x80004004 (E_ABORT)

여기를 클릭 sendMessage 첨부를 사용하는 코드에서 추출물의 허용 버튼 :

private const Int32 BM_CLICK = 0x00F5; 
private const Int32 GWL_STYLE = -16; 
private const Int32 CB_SETCURSEL = 0x14E; 
private const Int32 WM_LBUTTONDOWN = 0x201; 
private const Int32 WM_LBUTTONUP = 0x202; 

private const string dialogClass = "#32770"; 
private const string dialogTitle = "Microsoft Outlook"; 
const string tickBoxTitle = @"&Allow access for"; 
const string tickBoxClass = @"Button"; 

private const int ThreadSleepTime = 1000; 
private const int ThreadUiSleepTime = 20; 

IntPtr popupHandle; 
IntPtr tickHandle = IntPtr.Zero; 
IntPtr comboHandle = IntPtr.Zero; 
IntPtr allowHandle = IntPtr.Zero; 
while ((popupHandle = FindWindow(dialogClass, dialogTitle)) != IntPtr.Zero) 
{ 
    // Get object handles 
    tickHandle = FindWindowEx(popupHandle, tickHandle, tickBoxClass, tickBoxTitle); 
    comboHandle = FindWindowEx(popupHandle, tickHandle, null, null); 
    allowHandle = FindWindowEx(popupHandle, comboHandle, null, null); 

    // Click on tickbox until the combobox is enabled 
    while ((GetWindowLong(comboHandle, GWL_STYLE) & 0x8000000) != 0) 
    { 
     SendMessage(tickHandle, BM_CLICK, new IntPtr(1), IntPtr.Zero); 
     System.Threading.Thread.Sleep(ThreadUiSleepTime); 
    } 

    // Set dropdown box selection index to 3rd row 
    SendMessage(comboHandle, CB_SETCURSEL, 3, 0); 
    System.Threading.Thread.Sleep(ThreadUiSleepTime); 

    // Click Allow button 
    //SendMessage(allowHandle, BM_CLICK, new IntPtr(1), IntPtr.Zero); 

    SendMessage(allowHandle, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(MakeLParam(5, 5))); 
    System.Threading.Thread.Sleep(ThreadUiSleepTime); 
    SendMessage(allowHandle, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(MakeLParam(5, 5))); 
} 

왜 SendMessage가 작동하지 않고 어떻게이 작업을 수행 할 수 있습니까?

답변

2

이러한 경고를 표시하지 않는 EMAPI를 사용해야합니다.
Redemption library은 편리한 래퍼를 제공합니다.

1

스팸 악용으로 인해 무시할 수있는 방법이 없습니다.

그러나 다른 스레드를 사용하여 단추를 사냥하고 눌러야 작동합니다.

SendMessage는 마우스 버튼에 작동하지 않습니다. 액세스 가능성 API 또는 WM_COMMAND를 사용해야합니다.

아, 그리고 우연히 동일한 메시지를 다시 보내는 데 지연 루프를 사용하지 마십시오.

+0

또한 기계가 잠겨 있거나 터미널 서비스 등에서 이들 중 어느 것도 작동하지 않는다는 점에 유의하십시오. 로그인되어 있고 보이는 세션이 어딘가에 있어야합니다. – Deanna

+0

일부 접근성 API는 서비스 세션에서 작동합니다. WM_COMMAND는 그렇게하는 것으로 알려져 있습니다. – Joshua

+0

@Joshua, 내 방법 (위) 별도의 스레드에서 실행됩니다. 장기적으로는 Redemption을 사용하여 응용 프로그램을 다시 작성하려고 시도하지만 현재로서는이 작업을 수행해야합니다. 현재 내 코드는 tickbox를 틱하고 10 분 제한 시간을 선택합니다.하지만 거부 **를 클릭 한 것처럼 즉시 내 응용 프로그램 충돌을 허용 **을 클릭해도 ** 표시됩니다. 제안 된대로 WM_COMMAND를 사용하여 함수를 구현하는 데 도움을 주시겠습니까? 대단히 감사하겠습니다! – Serge