Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260

Таймер обратного отсчета

25.07.2015, 19:57. Показов 3237. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пишу таймер обратного отсчета до выключения пк!
На форме есть:
1 - Текстбокс,
2 - Кнопка для отсчета,
3 - 3 лабела ( для каждого, чтобы показывало час - мин - сек )
Как реализовать такое при помощи API? не через cmd!

Нужно чтобы при нажатие на кнопку происходил отсчет и по окончанию компьютер выключался!

API:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[DllImport("advapi32.dll", EntryPoint = "InitiateSystemShutdownEx")]
            static extern int InitiateSystemShutdown(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown);
            [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
            internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
            ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
            [DllImport("kernel32.dll", ExactSpelling = true)]
            internal static extern IntPtr GetCurrentProcess();
            [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
            internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
            [DllImport("advapi32.dll", SetLastError = true)]
            internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
            [DllImport("user32.dll", EntryPoint = "LockWorkStation")]
            static extern bool LockWorkStation();
            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            internal struct TokPriv1Luid
            {
                public int Count;
                public long Luid;
                public int Attr;
            }
            internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
            internal const int TOKEN_QUERY = 0x00000008;
            internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
            internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
            private void SetPriv()
            {
                TokPriv1Luid tkp;
                IntPtr htok = IntPtr.Zero;
                if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
                {
                    tkp.Count = 1;
                    tkp.Attr = SE_PRIVILEGE_ENABLED;
                    tkp.Luid = 0;
                    LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tkp.Luid);
                    AdjustTokenPrivileges(htok, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
                }
            }
            public int halt(bool RSh, bool Force)
            {
                SetPriv();
                return InitiateSystemShutdown(null, null, 0, Force, RSh);
            }
// ну и на кнопку : halt(false, true);
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2015, 19:57
Ответы с готовыми решениями:

Таймер обратного отсчета
Здравствуйте! Помогите написать код программы таймера обратного отсчета в формате: мин:сек:милсек - отображаются в текстбоксе, две кнопки...

Таймер обратного отсчета
Я новичок в С#, пытаюсь сделать таймер обратного отсчета 30 дней /часов/минут/секунд Как написать так, чтобы нужная дата вычитала...

Таймер обратного отсчета WinForms
Всем привет. Ребят, возникла небольшая проблемка. Ни в какую не получается вывести таймер на форму. Некогда получил вот такой код: ...

6
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
27.07.2015, 02:59
chaleureux, бросаешь на форму таймер, ставишь ему интервал 1000 мс, в обработчике Tick пишешь код обновления меток. Там же проверяешь истек ли интервал и если да запускаешь shutdown. Включать/выключать таймер можно с помощью свойства Enabled.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
27.07.2015, 17:17  [ТС]
Хорошо, а как сделать чтобы можно было вводить время через текстбокс, или как лучше?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
27.07.2015, 17:43
chaleureux, DateTimePicker c Format = Time или MaskedTextBox.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
28.07.2015, 14:42  [ТС]
Сделал на примере:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public partial class Form1 : Form
    {
        int h;
        int m;
        int s;
        public Form1()
        {
            InitializeComponent();
 
        }
// На кнопку:
 
if (textBox1.Text == "")
            {
                textBox1.Text = "0";
            }
            if (textBox2.Text == "")
            {
                textBox2.Text = "0";
            }
            if (textBox3.Text == "")
            {
                textBox3.Text = "0";
            }
 
            h = Convert.ToInt32(textBox1.Text);
            m = Convert.ToInt32(textBox2.Text);
            s = Convert.ToInt32(textBox3.Text);
 
            timer1.Start();
 
// На таймере (1000mc) стоит:
 
s = s - 1;
            if (s == 1)
            {
                m = m = - 1;
                s = 59;
            }
            if (m == -1)
            {
                h = h - 1;
                m = 59;
            }
 
 
            //if ( h == 0 && m == 0 && s == 0)
            //{
                
            //}
 
            string  hh = Convert.ToString(h);
            string  mm = Convert.ToString(m);
            string  ss = Convert.ToString(s);
 
            Hour.Text = hh;
            Minutes.Text = mm;
            Seconds.Text = ss;
           // halt(false, true);
Так вот отсчет идет но..
Поставил на таймере
1 текст бокс 24 || 2 тексбокс 59 || 3 текстбокс 59
Когда секунды заканчиваются на 2! минуты становятся 59, часы становяться 23!
И после уже минуты остаются на 59 а часы уменьшаются!
Может поможете?!
Вот проект:
Вложения
Тип файла: rar OFFSystem.rar (83.5 Кб, 11 просмотров)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
28.07.2015, 17:34
Лучший ответ Сообщение было отмечено chaleureux как решение

Решение

chaleureux, я бы сделал так. Комментируем в твоем примере переменные h, m, s. Вместо них пишем:
C#
1
TimeSpan interval;
Обработчик кнопки. Обрати внимание на комментарий про добавлениео дной секунды. Если тебя это не устраивает, то убери эту строку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void OFFSystemStart_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "") textBox1.Text = "0";
    if (textBox2.Text == "") textBox2.Text = "0";
    if (textBox3.Text == "") textBox3.Text = "0";
 
    int h = Convert.ToInt32(textBox1.Text);
    int m = Convert.ToInt32(textBox2.Text);
    int s = Convert.ToInt32(textBox3.Text);
    interval = new TimeSpan(h, m, s);
    // Добавляем 1 секунду чтобы отсчет начался с введенного времени
    interval = interval.Add(TimeSpan.FromSeconds(1));
 
    timer1.Start();
}
Обработчик события Tick. Мы используем готовую функциональность TimeSpan чтобы не тратить время на простую математику в которой оказывается тоже можно ошибиться
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void timer1_Tick(object sender, EventArgs e)
{
    interval -= TimeSpan.FromSeconds(1);
 
    Hour.Text = interval.Hours.ToString("00");
    Minutes.Text = interval.Minutes.ToString("00");
    Seconds.Text = interval.Seconds.ToString("00");
 
    if (interval == TimeSpan.Zero)
    {
        timer1.Enabled = false;
        // halt(false, true);
    }
}
P.S. Советую сразу давать элементам управления нормальные названия. textBox1, textBox2, timer1 и т.п. никуда не годятся.
1
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
28.07.2015, 19:15  [ТС]
Благодарю, всё прекрасно работает, спс за пример на будущее)

Как сделать чтобы было только Минуты и Секунды?!

Добавлено через 55 минут
Решил проблему:
Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class Form1 : Form
    {
        private const int minutes = 30;
        private const int seconds = 60;
        private int remains = minutes * seconds;
        public Form1()
        {
            InitializeComponent();
        }
// И на таймер кинул:
 
 var timer = (Timer)sender;
            remains = remains == 0 ? minutes * seconds : remains - timer.Interval / 1000;
            Counting.Text = String.Format("{0:D2} : {1:D2}", remains / 60, remains % 60);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2015, 19:15
Помогаю со студенческими работами здесь

Сделать таймер обратного отсчёта
код дайте пожалуйста , всё подробно чё как куда , спасибо

Таймер обратного отсчёта в игре
Есть идея сделать таймер с обратным отсчётом, для игры, и можно ли сделать так, что когда выбираешь неправильный ответ отнимается время?

Реализовать таймер обратного отсчета
подскажите пожалуйста чтобы вывести таймер обратного отсчета в часах минутах секундах что надо сделать int max =...

Выводить таймер обратного отсчёта в TextBox
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Таймер обратного отсчета и вывод в Label времени в формате чч:мм:сс
Помогите реализовать. У меня есть таймер в 3 часа (10800000 ms) Мне нужно чтобы этот отсчет выводил в лабейл время оставшиеся например:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru