Подпрограмма работает в Visual Studio, но не из файла .exe - PullRequest
0 голосов
/ 15 марта 2019

У меня проблема похожая на пользователя в этом посте Метод работает в Visual Studio, но не из exe . Однако решение, полученное в этом посте, не будет работать для меня, поэтому мне нужно еще несколько предложений от сообщества, чтобы посмотреть, как я могу преодолеть это.

Я потратил пару дней на программирование программы, которая работает именно так, как я хочу, в Visual Studio, но затем, когда я собираю решение и запускаю его из файла .exe, часть программы не работает.

Ниже приведена часть программы. Он вводит строчную букву «d», если в данный момент включена кнопка Caps Lock, или вводит букву «D», если Caps Lock в данный момент выключен.

Imports System.Threading
Imports System.Windows.Forms

Module NavigateToTopOfDemographicsScreenModule

    Sub NavigateToTopOfDemographicsScreen()

        If System.Windows.Forms.Control.IsKeyLocked(Keys.CapsLock) Then
            System.Windows.Forms.SendKeys.SendWait("d{Enter}")
        Else
            System.Windows.Forms.SendKeys.SendWait("D{Enter}")
        End If

        Thread.Sleep(1000)

    End Sub

End Module

Это консольное приложение .NET Framework. Он работает как приложение Windows Form, поэтому окно консоли не отображается для пользователя во время его работы.

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

Опять же, программа будет работать, когда я нажимаю кнопку «Выполнить» из Visual Studio, но затем, когда я собираю решение и пытаюсь запустить его из файла .exe, эта часть программы не работает.

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

C:\Windows\assembly\GAC_MSIL\Office\15.0.0.0__71e9bce111e9429c\Office.dll
C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Deployment.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Windows.Forms.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll
C:\Windows\assembly\GAC_MSIL\Microsoft.Vbe.Interop\15.0.0.0__71e9bce111e9429c\Microsoft.Vbe.Interop.dll

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 15 марта 2019

Итак, пока, похоже, это решение работает: Sendkeys не работает на UAC .Я нашел его на веб-сайте MSDN.

Чтобы перейти к сути, я открыл папку моего решения и нашел файл с именем App.Config .

Я открыл этот файл в Блокноте и добавил приведенный ниже код, чтобы заставить мой метод SendKeys.Wait использовать более новую версию метода, на которую ссылается пользователь в своей статье на MSDN.

<appSettings>
    <add key="SendKeys" value="SendInput"/>
</appSettings>

После того, как я это сделал, я запустил программу из исполняемого файла, и теперь она, кажется, работает согласованно, как и при запуске из Visual Studio 2017. Я обновлю этот пост, если у меня возникнут какие-либо дальнейшие проблемы.

Ниже приведено то, что пользователь написал на веб-сайте MSDN, который, кажется, помог мне.

Если ваше приложение зависит от согласованного поведения независимо от операционной системы, вы можете заставить класс SendKeys использоватьновая реализация, добавив следующую настройку приложения в файл app.config.

<appSettings>
    <add key="SendKeys" value="SendInput"/>
</appSettings>

Чтобы класс SendKeys использовал предыдущую реализацию, используйте вместо этого значение «JournalHook».

Спасибо!

Марк С.

...