Поражение «Программа пытается получить доступ к электронной почте» с помощью SendMessage - PullRequest
2 голосов
/ 22 декабря 2011

Я пишу приложение на C #, которое использует Office Outlook Interop (2010; версия 14) для доступа к данным электронной почты через MAPI.

До сих пор мне приходилось вручную и многократно нажимать Разрешить в Outlook "Программа пытается получить доступ к информации об адресе электронной почты, хранящейся в всплывающем окне безопасности Outlook (снимок экрана http://i.stack.imgur.com/gj8to.png).

. Я попытался написать метод автоматического нажатия, но безуспешно.но Outlook Interop выдает следующее исключение во время следующей операции чтения:

Исключение из 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 ]

2 голосов
/ 22 декабря 2011

Вы должны использовать EMAPI, который не отображает эти предупреждения.
Библиотека Погашение предоставляет удобную оболочку.

1 голос
/ 22 декабря 2011

Не должно быть способа переопределения из-за злоупотребления спамом.

Однако работает другой поток для поиска и нажатия кнопки.

Обратите внимание, что SendMessage неработать для кнопок мыши.Вы должны использовать API доступа или WM_COMMAND.

О, и, кстати, не используйте циклы задержки при повторной отправке того же сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...