子例程可在Visual Studio中工作,但不能从.exe文件中工作

时间:2019-03-14 21:14:26

标签: .net vb.net visual-studio console-application interop

我在此帖子Method Works In Visual Studio But Not From exe中遇到类似于用户的问题。但是,本文中提出的解决方案对我而言不起作用,因此我需要社区提供更多建议,以了解如何解决此问题。

我花了几天的时间来编写一个程序,该程序可以在Visual Studio中完全按照我的要求运行,但是当我构建解决方案并从.exe文件运行该程序时,该程序的一部分无法正常工作。

程序的一部分在下面。如果用户的Caps Lock键当前处于打开状态,则键入小写的“ d”;如果当前已关闭Caps Lock,则键入“ D”。

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窗体应用程序运行,以便控制台窗口在运行时不会向用户显示。

我正在使用程序的这一部分向其他程序发送击键,以确保在屏幕抓取之前该程序在正确的屏幕上。

同样,当我按下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 :(得分:0)

因此,到目前为止,此解决方案似乎正在起作用:Sendkeys not working on UAC。我在MSDN网站上找到它。

要点很明确,我要做的是打开解决方案的文件夹,并找到一个名为 App.Config 的文件。

我在记事本中打开此文件,并添加了以下代码来强制我的SendKeys.Wait方法使用该方法的较新版本,就像用户在MSDN上的文章中所提到的那样。

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

这样做之后,我从可执行文件中运行了该程序,它现在似乎与从Visual Studio 2017中运行该程序时一样工作。如果还有其他问题,我将更新此帖子。

下面是用户在MSDN网站上写的内容,似乎对我有帮助。

  

如果您的应用程序在任何操作系统上都依赖一致的行为,则可以通过将以下应用程序设置添加到app.config文件中,强制SendKeys类使用新的实现。

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

要强制SendKeys类使用以前的实现,请改用值“ JournalHook”。

谢谢!

马克S。