RegisterAppStateChangeNotification 应该如何工作?

问题描述 投票:0回答:1

微软文档说:

https://learn.microsoft.com/en-us/windows/win32/api/appnotify/nf-appnotify-registerappstatechangenotification

使应用程序能够注册回调函数,通过该函数可以通知它的库正在进入或退出挂起状态。应用程序可以使用此信息来执行任何必要的操作,例如应在此时执行的保留状态。

我认为这意味着如果我的应用程序被暂停,我可以使用它来获取回调,但我似乎没有得到回调。我想知道,我是否误解了此调用的目的,或者我的实现有问题?我在 Google 上没有看到任何使用此方法的示例。

这是我的代码。我有另一个应用程序,它会挂起与该应用程序关联的所有线程,以将其置于挂起状态。

我的最终目标是能够知道我的应用程序之前是否被另一个应用程序暂停并恢复。

public partial class Form1 : Form
{
    [DllImport("api-ms-win-core-psm-appnotify-l1-1-0.dll")]
    static extern bool RegisterAppStateChangeNotification(
            PAPPSTATE_CHANGE_ROUTINE Routine
        , IntPtr Context
        , out IntPtr Registration
        );
    
    IntPtr context;

    public delegate void PAPPSTATE_CHANGE_ROUTINE(bool Quiesced, IntPtr Context);
    public static readonly PAPPSTATE_CHANGE_ROUTINE stateChangedCallback = OnStateChanged;

    public Form1()
    {
        InitializeComponent();
        RegisterStateChange();
        txtProcessId.Text = Process.GetCurrentProcess().Id.ToString(); //have this to make it easy to suspend the thread
    }
    
    public void RegisterStateChange()
    {
        RegisterAppStateChangeNotification(stateChangedCallback, IntPtr.Zero, out context);
    }
    public static void OnStateChanged(bool Quiesced, IntPtr Context)
    {
        MessageBox.Show("here!!!");
    }
}
c# winapi
1个回答
0
投票

此功能适用于通用Windows平台(UWP)。 UWP 应用程序具有由操作系统管理的进程生命周期,这意味着操作系统会自动挂起和恢复应用程序,并且此功能允许您收到有关操作系统正在执行的操作的通知。如果您正在开发传统的 Win32 应用程序,则此函数不相关,因为操作系统不会自动挂起或恢复 Win32 应用程序。两种应用程序(Win32 和 UWP)都可以在任务管理器中手动挂起,即使在 UWP 情况下也会绕过此功能,因为这是用户而不是操作系统执行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.