【问题标题】:WPF application won't open using Application.Run();WPF 应用程序不会使用 Application.Run() 打开;
【发布时间】:2018-08-10 09:10:43
【问题描述】:

我引用了 System.Windows.Forms.dll,并想使用Application.Run();,但我的应用程序无法打开。我在控制台中没有收到任何错误,并且该应用程序在任务管理器中可见。

这是我的代码:

public partial class MainWindow : Window
{
    TextBoxOutputter outputter;

    public MainWindow()
    {
        InitializeComponent();
        Init();
    }

    public void Init()
    {
        outputter = new TextBoxOutputter(TestBox);
        Console.SetOut(outputter);


        using (var api = new KeystrokeAPI())
        {
            api.CreateKeyboardHook((character) => { Console.Write(character); });
            Application.Run();
        }

    }
}

如果没有Application.Run();,应用程序会运行,但在按下任意键后会立即崩溃。我在崩溃时收到此消息:

CallbackOnCollectedDelegate' : '对垃圾进行了回调 收集类型的委托 'KeystrokeAPI!Keystroke.API.User32+LowLevelHook::Invoke'。这可能 导致应用程序崩溃、损坏和数据丢失。通过时 委托给非托管代码,它们必须由托管保持活动状态 应用程序,直到保证它们永远不会被调用。'

我正在使用这个 API:https://github.com/fabriciorissetto/KeystrokeAPI

【问题讨论】:

  • 显示应用程序的入口点以及创建MainWindow 的位置,看起来您可能正在做一些奇怪的事情,可能调用 Run 两次或其他什么,这并不能完全解释错误虽然...
  • public partial class MainWindow : Window {的顶部
  • 为什么要在窗口中调用 Application.Run?

标签: c# wpf


【解决方案1】:

我假设是您的 WPF 应用程序将从应用程序的入口点调用 Application.Run();。您应该能够在运行之前在应用程序中设置挂钩,然后在加载窗口时设置控制台输出。

App.xaml; 移除 StartupUri 标签并将其替换为 Startup,在 App.xaml.cs 中创建新的事件回调。

App.xaml.cs 在新的启动事件回调中,可以设置钩子。

using (var api = new KeystrokeAPI())
        {
            api.CreateKeyboardHook((character) => { Console.Write(character); });
            Application.Run();
        }

MainWindow.cs 然后,一旦你的窗口加载完毕,你应该能够控制台的输出。

public void Init()
    {
        outputter = new TextBoxOutputter(TestBox);
        Console.SetOut(outputter);
    }

这意味着您在钩子仍然进行时不会调用Application.Run(); 两次。

目前,我认为问题在于,您启动应用程序,它会自动初始化一个新实例并运行它。然后,您还调用Application.Run();,它现在会覆盖先前的初始化并重新开始。这意味着您的 Window、Console 和 Delegate 现在位于先前的覆盖实例中,并被 GC 销毁。因此,您已将 KeystrokeAPI 绑定到已销毁的委托 - (character) => { Console.Write(character); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多