لا يزال FlashWindowEx FLASHW_STOP يحافظ على شريط المهام ملونًا

StackOverflow https://stackoverflow.com/questions/21987

  •  09-06-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق يتحكم في الجهاز.
عندما أتلقى خطأ من الجهاز، يجب أن يكون المستخدمون قادرين على ملاحظة ذلك مباشرة، وإحدى الطرق التي يتم بها ذلك هي وميض الدرج على شريط المهام.عندما يقوم الجهاز بمسح الخطأ، يجب أن يتوقف الدرج عن الوميض.

هناك إزعاج بسيط عند استخدام وظيفة FlashWindowEx، عندما أقوم بمسح وميض النافذة، تظل (في حالتي WinXP) برتقالية (لا تومض).
Sample of status


    [Flags]
        public enum FlashMode {
            /// 
            /// Stop flashing. The system restores the window to its original state.
            /// 
            FLASHW_STOP = 0,
            /// 
            /// Flash the window caption.
            /// 
            FLASHW_CAPTION = 1,
            /// 
            /// Flash the taskbar button.
            /// 
            FLASHW_TRAY = 2,
            /// 
            /// Flash both the window caption and taskbar button.
            /// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
            /// 
            FLASHW_ALL = 3,
            /// 
            /// Flash continuously, until the FLASHW_STOP flag is set.
            /// 
            FLASHW_TIMER = 4,
            /// 
            /// Flash continuously until the window comes to the foreground.
            /// 
            FLASHW_TIMERNOFG = 12
        }

        public static bool FlashWindowEx(IntPtr hWnd, FlashMode fm) {
            FLASHWINFO fInfo = new FLASHWINFO();

            fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
            fInfo.hwnd = hWnd;
            fInfo.dwFlags = (UInt32)fm;
            fInfo.uCount = UInt32.MaxValue;
            fInfo.dwTimeout = 0;

            return FlashWindowEx(ref fInfo);
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct FLASHWINFO {
            public UInt32 cbSize;
            public IntPtr hwnd;
            public UInt32 dwFlags;
            public UInt32 uCount;
            public UInt32 dwTimeout;
        }

في حالتي أستخدم FLASHW_TRAY لبدء الوميض وFLASHW_STOP لإيقاف الوميض.

هل أفعل شيئًا خاطئًا أم أن هذا خطأ معروف في نظام WinXP وهل هناك حل له؟

هل كانت مفيدة؟

المحلول

يكون السلوك هو نفسه عندما تنتهي النافذة من الوميض طالما كان من المفترض أن:يظل زر شريط المهام ملونًا.لا أعتقد أن هذا خطأ.إذا فكرت في الأمر، عند استخدام FLASHW_STOP، فإن الوميض يتوقف في الواقع، ولكن الهدف من الوميض هو جذب انتباه المستخدم.يظل الزر ملونًا لأن المستخدم ربما لم ينظر إلى الأسفل ويكتشفه أيّ كانت النافذة تحاول لفت انتباهها.يؤدي إبقاء الزر ملونًا إلى إبقاء هذه المعلومات متاحة.

نصائح أخرى

وهنا خطأ:

fInfo.uCount = UInt32.MaxValue;

يجب عليك ضبط fInfo.uCount على الصفر عند الاتصال باستخدام المعلمة FLASHW_STOP.وإلا، فعندما تحاول الاتصال بالتوقف عندما يكون زر شريط المهام نشطًا، فسيظل نشطًا.

يمكنك التحقق من ملاحظة حول السلوك غير المحدد هنا:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

أعلم أن هذا منشور قديم ولكنه يمكن أن يساعد الآخرين على حل هذه المشكلة بسرعة.

آسف على الرد المتأخر، كنت خارج المكتب.

إذا كانت هذه هي الوظيفة المتوقعة، فأعتقد أنها ليست مفيدة جدًا، على الأقل يجب أن تكون هناك إعادة تعيين.

لقد أصلحته الآن فقط باستخدام FLASHW_ALL | FLASHW_TIMERNOFG مزيج.

راجع للشغل، لا أستطيع تقييم إجاباتك، وليس مندوبا كافيا حتى الآن.

ما عليك سوى ضبط uCount على 0 لإيقاف الوميض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top