ShowBalloonTip - uśpienie procesu

0

Witam,

chciałbym w swoim programie użyć chmurek, które oferowane są przez klasę notifyIcon. Niestety metoda ShowBalloonTip jest zbugowana i nie można nadać jej czasu, przez jaki chmurka będzie się wyświetlać. Wobec czego chciałem wyjść na przeciw problemowi i napisałem coś takiego:

 
        ShowBalloonWindow(40);

        private void ShowBalloonWindow(int timeout)
        {
            int timeoutCount = 0;

            while (timeoutCount < timeout)
            {
                notifyIcon.ShowBalloonTip(timeout, " ", " ", ToolTipIcon.None);
                //System.Threading.Thread.Sleep(1000);
                timeoutCount++;
            }
        }

W tym momencie napotkałem też problem - System.Threading zawiesza całą aplikację i nie da się nic zrobić przez te 40 sekund. A chciałbym by obyło się bez tego. Chciałbym także by chmurkę można było zamknąć. Pytanie do was: Czego mogę użyć, by działało to tak, jakbym chciał?

Z góry dziękuję, za wszelkie pomysły i sugestie.


Edit:

Ok, poradziłem sobie. Użyłem timera:

 
        public static class MyGlobals
        {
            public static int t = 15;
        }

A następnie:

                Timer timer = new Timer();

                timer.Tick += new EventHandler(timer1_Tick);
                timer.Interval = (1000);
                timer.Enabled = true;
                timer.Start();


        private void timer1_Tick(object sender, EventArgs e)
        {
            if (MyGlobals.t > 0)
            {
                notifyIcon.ShowBalloonTip(1, " ", " ", ToolTipIcon.None);
                MyGlobals.t--;
            }
            if (MyGlobals.t == 0)
                timer1.Stop();
        }
 
0
zjadarka napisał(a):

Niestety metoda ShowBalloonTip jest zbugowana i nie można nadać jej czasu, przez jaki chmurka będzie się wyświetlać.

Pierwszym parametrem tej metody jest czas wyświetlania chmurki, co tam Ci konkretnie nie działa?

2
zjadarka napisał(a):
 
        ShowBalloonWindow(40);

        private void ShowBalloonWindow(int timeout)
        {
            int timeoutCount = 0;

            while (timeoutCount < timeout)
            {
                notifyIcon.ShowBalloonTip(timeout, " ", " ", ToolTipIcon.None);
                //System.Threading.Thread.Sleep(1000);
                timeoutCount++;
            }
        }

ten kod nie ma nawet żadnego sensu :|

Ok, poradziłem sobie. Użyłem timera:

 
        public static class MyGlobals
        {
            public static int t = 15;
        }

A następnie:

                Timer timer = new Timer();

                timer.Tick += new EventHandler(timer1_Tick);
                timer.Interval = (1000);
                timer.Enabled = true;
                timer.Start();


        private void timer1_Tick(object sender, EventArgs e)
        {
            if (MyGlobals.t > 0)
            {
                notifyIcon.ShowBalloonTip(1, " ", " ", ToolTipIcon.None);
                MyGlobals.t--;
            }
            if (MyGlobals.t == 0)
                timer1.Stop();
        }
 

a ten tym bardziej
po prostu timeout podajemy w milisekundach
wystarczyło napisać:

notifyIcon.ShowBalloonTip(40 * 1000, " ", " ", ToolTipIcon.None); // dymek na 40 sekund
0

Dziwne zachowanie - krytykować kogoś, nie mając racji. Pisałem przecież:

Niestety metoda ShowBalloonTip jest zbugowana i nie można nadać jej czasu, przez jaki chmurka będzie się wyświetlać.

Może ubrałem to w złe słowa. A może po prostu liczyłem na to, że tematem zainteresują się osoby, które używały tego wcześniej. Bug polega na tym, że jakiejkolwiek wartości nie wpiszesz w pierwszym argumencie funkcji chmurka i tak zawsze wyświetla się przez ten sam czas (w zależności od systemu operacyjnego).

Co do krzykaczy, że nawet nie zadałem sobie trudu, by przeczytać dokumentację - przykro mi za was, bo w dokumentacji jest o tym problemie wspomniane. Tak jak pisałem - wywoływanie metody z różnymi wartościami nic nie dawało - chmurka i tak wyświetlała się taką samą ilość czasu. Za krótko moim zdaniem. Nie miałem też pojęcia przez jaki czas będzie się wyświetlać na innych komputerach, a więc stąd cała ta "walka z wiatrakami".

Linki:
http://msdn.microsoft.com/en-us/library/ms160065.aspx
http://stackoverflow.com/questions/6846112/notifyicon-showballoontip-not-keeps-timeout

I ogólny mesydż: Zanim założycie, że ktoś jest debilem, sami sprawdźcie, czy nie wychodzicie na debili. Nie zwracam się tutaj do somekind, bo on jak widać potrafił się zachować :)

0
zjadarka napisał(a):

Dziwne zachowanie - krytykować kogoś, nie mając racji. Pisałem przecież:

Niestety metoda ShowBalloonTip jest zbugowana i nie można nadać jej czasu, przez jaki chmurka będzie się wyświetlać.

Co do krzykaczy, że nawet nie zadałem sobie trudu, by przeczytać dokumentację - przykro mi za was, bo w dokumentacji jest o tym problemie wspomniane. Tak jak pisałem - wywoływanie metody z różnymi wartościami nic nie dawało - chmurka i tak wyświetlała się taką samą ilość czasu. Za krótko moim zdaniem. Nie miałem też pojęcia przez jaki czas będzie się wyświetlać na innych komputerach, a więc stąd cała ta "walka z wiatrakami".

Linki:
http://msdn.microsoft.com/en-us/library/ms160065.aspx
http://stackoverflow.com/questions/6846112/notifyicon-showballoontip-not-keeps-timeout

I ogólny mesydż: Zanim założycie, że ktoś jest debilem, sami sprawdźcie, czy nie wychodzicie na debili. Nie zwracam się tutaj do somekind, bo on jak widać potrafił się zachować :)

no możliwe że nie działa bo:

msdn napisał(a)

Minimum and maximum timeout values are enforced by the operating system and are typically 10 and 30 seconds, respectively, however this can vary depending on the operating system. Timeout values that are too large or too small are adjusted to the appropriate minimum or maximum value. In addition, if the user does not appear to be using the computer (no keyboard or mouse events are occurring) then the system does not count this time towards the timeout.
Only one balloon tip can display on the taskbar at a time. Attempting to display a balloon tip when one is currently displayed on the taskbar causes the timeout value to be ignored. The behavior is slightly different depending on the operating system and whether the balloon tip is from another, or the same, application. When the second balloon tip is from another application, the first balloon tip will display for the minimum timeout value before the second appears, regardless of the value of timeout. In most cases, if the balloon tips are from the same application, the first balloon tip immediately closes when another call to the ShowBalloonTip method is made.

ogólnie działa to tak że chmurka jest wyświetlana i znika jeśli user dalej używa systemu, zostaje jeśli user się nią zainteresuje i najedzie na nią myszką lub jeśli prawdopodobnie usera nie ma przy komputerze i nie rusza się myszką ani nie korzysta z klawiatury
patrząc ze strony użytkownika imo to lepsze zachowanie

w każdym razie nie zmienia to faktu że Twój kod jest de... nienajlepszy
po pierwsze - w działającym przypadku podajesz timeout na 1 milisekundę czyli możliwe że u kogoś będzie ta chmurka migać 15 razy co sekundę na 1 milisekundę
poza tym - nie da się tej chmurki zamknąć (tzn. da się - ale w pesymistycznym przypadku trzeba będzie to zrobić aż 15 razy)
po trzecie - Twoja chmurka i tak nie zniknie po 15 sekundach jeśli nikt nie będzie dotykać komputera

chcesz samemu dokładnie opisać zachowanie chmurki? stwórz własną

0
unikalna_nazwa napisał(a):

w każdym razie nie zmienia to faktu że Twój kod jest de... nienajlepszy
po pierwsze - w działającym przypadku podajesz timeout na 1 milisekundę czyli możliwe że u kogoś będzie ta chmurka migać 15 razy co sekundę na 1 milisekundę
poza tym - nie da się tej chmurki zamknąć (tzn. da się - ale w pesymistycznym przypadku trzeba będzie to zrobić aż 15 razy)
po trzecie - Twoja chmurka i tak nie zniknie po 15 sekundach jeśli nikt nie będzie dotykać komputera

chcesz samemu dokładnie opisać zachowanie chmurki? stwórz własną

Jesteś w błędzie.

Timeout values that are too large or too small are adjusted to the appropriate minimum or maximum value.

Wartość jednej milisekundy jest naspisywana przez system i zastępowana przez odpowiednią dla niego wartość.

Co do drugiego: Po kliknięciu w balonik egzekwowany jest kod w któwym zawarta jest linia:

notifyIcon1.Visible = true;

Nie umieszczałem tego na forum, ponieważ nie to było powodem moich problemów. Poza tym jest on w zupełnie innym bloku programu. Więc fear not, balonik nie wyświetla się cały czas, tak jak zakładałeś.

Co do trzeciego: I miała nie znikać. Właśnie po to bym miał pewność, że powiadomienie dotrze do użytkownika. Jeżeli przykładowo odszedł od komputera zrobić sobie herbatę.

Podsumowując, dalej uważam, że powinieneś dwa razy zastanowić się, zanim napiszesz, że coś jest debilne.

0
zjadarka napisał(a):

Co do trzeciego: I miała nie znikać. Właśnie po to bym miał pewność, że powiadomienie dotrze do użytkownika. Jeżeli przykładowo odszedł od komputera zrobić sobie herbatę.

W takiej sytuacji wyświetla się okienko dialogowe, być może nawet modalne. Chmurki w trayu nie do tego służą. :)

0

Ale ona nie znika jedynie, gdy nic za kompem się nie dzieje - użytkownik nie używa myszki i klawiatury ;) I to też jest w dokumentacji tej metody :P

0

Ale mimo wszystko malutką chmurkę koło zegara łatwiej zignorować niż okno na środku ekranu.
No, ale rób jak chcesz, nie trzeba w końcu pisać używalnych programów. ;P

0

;) Ale widzisz, ja chciałem uzyskać pewien kompromis - okienko w którym nic nie trzeba klikać, jeżeli chcemy je olać. Ale za razem takie, by go nie przeoczyć. Nic w stylu MessageBox'ów, czy coś takiego gdzie trzeba klikać "OK". Mnie osobiście takie rzeczy wkurzają, jak robię coś za kompem a tu nagle bach, i coś chce czegoś ode mnie ;) Przemyślałem temat w tej kwestii dokładnie i wszystko jest tak jak chciałem i sobie założyłem. No ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1