Не может поймать спят/приостанавливают сообщения (winXP)

Я проверил пакет, упомянутый @Makarand Bauskar. Однако я не был удовлетворен. Он не активен и использует собственный способ работы / работы с заголовком Last-Modified. Поэтому я решил создать новый пакет django-rest-framework-condition , который будет:

  1. Повторно использовать реализацию из Django
    • , он получит исправления от Django
    • Вы можете использовать его так же, как описано в документах Джанго
  2. . Предоставить @last_modified и @etag decorator

[ 1110] Для его установки:

pip install django-rest-framework-condition

Использование:

from django.contrib.auth import get_user_model
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework_condition import last_modified


def my_last_modified(request, *args, **kwargs):
    return datetime(2019, 1, 1)


class SubscriptionViewSet(ViewSet):
    @last_modified(my_last_modified)
    def list(self, request):
        data = {'user_count': get_user_model().objects.count()}
        return Response(data)

6
задан Community 23 May 2017 в 10:32
поделиться

4 ответа

It works now, for both XP and Vista. I created a stub winform app with the relevant code (could be cleaned up, obviously, but it conveys the point).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace standbyTest
{
    public partial class Form1 : Form
    {

        [DllImport("Kernel32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
        protected static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE state);

        [Flags]
        public enum EXECUTION_STATE : uint
        {
            ES_CONTINUOUS = 0x80000000,
            ES_DISPLAY_REQUIRED = 2,
            ES_SYSTEM_REQUIRED = 1,
            ES_AWAYMODE_REQUIRED = 0x00000040
        }

        public Form1()
        {
            if(Environment.OSVersion.Version.Major > 5)
            {
                // vista and above: block suspend mode
                SetThreadExecutionState(EXECUTION_STATE.ES_AWAYMODE_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
            }

            InitializeComponent();

            //MessageBox.Show(string.Format("version: {0}", Environment.OSVersion.Version.Major.ToString() ));

        }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            if(Environment.OSVersion.Version.Major > 5)
            {
                // Re-allow suspend mode
                SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
            }
        }


        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            // Power status event triggered
            if(m.Msg == (int)WindowMessage.WM_POWERBROADCAST)
            {
                // Machine is trying to enter suspended state
                if(m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSUSPEND ||
                        m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSTANDBY)
                {
                    // Have perms to deny this message?
                    if((m.LParam.ToInt32() & 0x1) != 0)
                    {
                        // If so, deny broadcast message
                        m.Result = new IntPtr((int)WindowMessage.BROADCAST_QUERY_DENY);
                    }
                }
                return;
            }

            base.WndProc(ref m);
        }
    }



    internal enum WindowMessage
    {

        /// <summary>
        /// Notify that machine power state is changing
        /// </summary>
        WM_POWERBROADCAST = 0x218,
        /// <summary>
        /// Message indicating that machine is trying to enter suspended state
        /// </summary>
        PBT_APMQUERYSUSPEND = 0x0,
        PBT_APMQUERYSTANDBY = 0x0001,

        /// <summary>
        /// Message to deny broadcast query
        /// </summary>
        BROADCAST_QUERY_DENY = 0x424D5144


    }
}
3
ответ дан 17 December 2019 в 07:09
поделиться

Вы работаете на Vista или Windows Server 2008? Эта страница говорит

Из-за изменений в Модели Управления питанием для Windows Vista и Windows Server 2008, событие PBT-APMQUERYSUSPEND больше не поставляется приложениям. Вместо этого событие BT_APMSUSPEND поставляется...

Это могло быть то, почему Вы не видите его?

0
ответ дан 17 December 2019 в 07:09
поделиться

Я попробовал этот же код в тестовом приложении на моей (dev) машине и на другой (тестовой) машине ( также winXP). На моей машине она продолжает выходить из строя, то есть машина уходит в сон. Но на другой машине все работает! Сначала я думал, что это проблема отладки и режима выпуска, но это не так.

Кажется, что-то не так в моей машине разработчика, хотя я понятия не имею, что это может быть.

Тайна решена .. Сорта.

0
ответ дан 17 December 2019 в 07:09
поделиться

В Vista вызовите SetThreadExecutionState, чтобы уведомить WPM о том, что система не находится в режиме ожидания.

В Windows XP / 2000:
Приложение может вернуть BROADCAST_QUERY_DENY, чтобы отклонить запрос PBT_APMQUERYSUSPEND или PBT_APMQUERYSUSPENDFAILED.

MSDN: Windows XP и более ранние версии: система передает событие PBT_APMQUERYSUSPEND, чтобы запросить разрешение на приостановку работы системы. Система ожидает, что каждое приложение и драйвер определят, должно ли запрошенное событие произойти, и вернут TRUE, если оно произойдет, или вернут BROADCAST_QUERY_DENY в противном случае. Приложения не должны отклонять этот запрос. Если приложение отклоняет этот запрос, система передает событие PBT_APMQUERYSUSPENDFAILED. Это событие уведомляет приложения и драйверы о продолжении работы в обычном режиме.

Также я не думаю, что PBT_APMQUERYSTANDBY или PBT_APMSTANDBY поддерживаются в Win2K. Вы пробовали глобально регистрировать трансляцию, когда Windows выключается, чтобы увидеть, отправляются ли они?

0
ответ дан 17 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: