如何在不运行Win32 GUI应用程序时获取Windows电源状态消息(WM_POWERBROADCAST)? [英] How to get the Windows Power State Message (WM_POWERBROADCAST) when not running a Win32 GUI app?

查看:150
本文介绍了如何在不运行Win32 GUI应用程序时获取Windows电源状态消息(WM_POWERBROADCAST)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以基本上我有一个由GUI应用程序加载的插件dll。在这个DLL中,我需要检测Windows进入休眠状态。我不能修改GUI应用程序。 GetMessage只有当调用线程是与UI线程相同的线程,它不是。任何想法?

So basically I have a plugin dll that is loaded by a GUI-Application. In this dll I need to detect when Windows enters the Hibernate state. I cannot modify the GUI-App. GetMessage only works if the calling thread is the same thread as the UI-Thread, which it is not. Any ideas?

推荐答案

您可以在DLL代码的独立线程中创建一个隐藏窗口。并处理如下所示的消息。

You could create a hidden window in a seperate thread from your DLL code. And process messages as shown below.

您可以使用此Window类。

You could use this Window class for that.

#pragma once

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

static const char *g_AppName  = "Test";

class CMyWindow
{
    HWND  _hWnd;
    int _width;
    int _height;
public:
    CMyWindow(const int width,const int height):_hWnd(NULL),_width(width),_height(height)
    {
        _beginthread( &CMyWindow::thread_entry, 0, this);
    }

    ~CMyWindow(void)
    {
        SendMessage(_hWnd, WM_CLOSE, NULL, NULL);
    }


private:
    static void thread_entry(void * p_userdata)
    {
        CMyWindow * p_win = static_cast<CMyWindow*> (p_userdata);
        p_win->create_window();
        p_win->message_loop();
    }

    void create_window()
    {
        WNDCLASSEX wcex;

        wcex.cbSize 		= sizeof(WNDCLASSEX);
        wcex.style  		= CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = &CMyWindow::WindowProc;
        wcex.cbClsExtra 	= 0;
        wcex.cbWndExtra 	= 0;
        wcex.hInstance  	= GetModuleHandle(NULL);
        wcex.hIcon  		= LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor    	= LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = g_AppName;
        wcex.hIconSm    	= LoadIcon(NULL, IDI_APPLICATION);

        RegisterClassEx(&wcex);

        _hWnd = CreateWindow(g_AppName, g_AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, GetModuleHandle(NULL), NULL);

        ShowWindow(_hWnd, SW_SHOWDEFAULT);
        UpdateWindow(_hWnd);
    }

    void message_loop()
    {
        MSG msg = {0};

        while (GetMessage(&msg, NULL, 0, 0))
        {
            if(msg.message == WM_QUIT)
            {
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    static LRESULT WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_POWERBROADCAST:
            {
                //power management code here
            }

        }

        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
};

同时确保包含退出条件。

Also make sure to include an exit condition.

这篇关于如何在不运行Win32 GUI应用程序时获取Windows电源状态消息(WM_POWERBROADCAST)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆