SendKeys.Send NullReferenceException

Я пытаюсь отправить ключи к элементу управления в моей форме. Но я получаю исключение NullReferenceException, и я не знаю, почему. Код настолько прост, насколько это возможно:

Private Sub Button19_Click(sender As System.Object, e As System.EventArgs) Handles Button19.Click
    DateTimePicker2.Focus() 'commenting out this line has no effect
    SendKeys.Send("{F4}") 'error thrown on this line
End Sub

Сообщается об ошибке object reference not set to an instance of an object, но Send является общим методом, поэтому не требует экземпляра.

Странно, если я игнорирую ошибку, она работает нормально, и F4 передается в управление. Я знаю, что была проблема с sendkeys и UAC, но я думал, что она решена (я использую фреймворк 4.0).


person Matt Wilko    schedule 09.05.2012    source источник
comment
Возможно ли, что ошибка возникает на принимающей стороне sendkey? Я имею в виду, у вас есть какой-нибудь код в вашем целевом элементе управления, который обрабатывает клавишу F4?   -  person Steve    schedule 09.05.2012
comment
Нет, я не считаю, что DatTimePicker должен обрабатывать клавишу F4, чтобы отобразить средство выбора календаря а-ля этот ответ по теме   -  person Matt Wilko    schedule 09.05.2012
comment
Как ни странно, если я игнорирую ошибку, она работает нормально - вы получаете ошибку только в Visual Studio? Вы включили уведомления об исключениях первого шанса?   -  person    schedule 09.05.2012
comment
Можете ли вы сфокусироваться на элементе управления в форме и нажать F4, чтобы посмотреть, что произойдет?   -  person JeffO    schedule 09.05.2012
comment
@JeffO - переход к элементу управления и нажатие F4 работает нормально - ошибок нет, и календарь падает нормально   -  person Matt Wilko    schedule 09.05.2012
comment
@hvd - да, я разбиваю выброшенные исключения, но почему я вообще получаю это исключение?   -  person Matt Wilko    schedule 09.05.2012
comment
Focus, вероятно, является неправильным методом Использование: Focus — это низкоуровневый метод, предназначенный в первую очередь для авторов пользовательских элементов управления. Вместо этого разработчики приложений должны использовать метод Select.   -  person Damien_The_Unbeliever    schedule 09.05.2012


Ответы (1)


Этот вызов не генерирует исключение, исключение генерируется в SendKeys.LoadSendMethodFromConfig() и обрабатывается внутри (поэтому, если вы поместите try/catch вокруг этого вызова, вы увидите, что никакое исключение фактически не перехвачено в вашем пользовательском коде) .

Вы видите это в отладчике, потому что ваши исключения настроены на остановку при любом выброшенном исключении, независимо от того, где оно возникает и было ли оно обработано.

Я предлагаю перейти в «Инструменты»> «Параметры»> «Отладка» и установить флажок «Включить только мой код».

Вот как выглядит метод, вызывающий исключение. Обратите внимание, что он намеренно проглатывает все исключения:

    private static void LoadSendMethodFromConfig()
    { 
        if (!sendMethod.HasValue) 
        {
            sendMethod = SendMethodTypes.Default; 

            try
            {
                // read SendKeys value from config file, not case sensitive 
                string value = System.Configuration.ConfigurationManager.AppSettings.Get("SendKeys");

                if (value.Equals("JournalHook", StringComparison.OrdinalIgnoreCase)) 
                    sendMethod = SendMethodTypes.JournalHook;
                else if (value.Equals("SendInput", StringComparison.OrdinalIgnoreCase)) 
                    sendMethod = SendMethodTypes.SendInput;
            }
            catch {} // ignore any exceptions to keep existing SendKeys behavior
        } 
    }
person roken    schedule 09.05.2012