Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Как реализовать акселератор нажатия кнопки?

25.10.2016, 06:57. Показов 3416. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.
При нажатии и удержании одной из кнопок со стрелками элемента управления NumericUpDown скорость смены значений в окне увеличивается. То же происходит и при работе с клавиатурой: если нажать и держать клавишу нажатой, то через какое-то время частота "нажатий" возрастает. Пусть есть кнопка на форме, при клике на которой происходит какое-то отображаемое на форме событие. Пользователь нажал кнопку мышкой и не отпускает. Событие должно повторятся сначала раз в секунду, а если он её не отпустит ещё пару секунд, то частота повторения событий должна увеличится втрое. На VB-6 это выглядело так:
Visual Basic
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
Private Sub imgYearForward_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
flgYearForwardBtn = True 'TRUE = нажата кнопка "год вперёд"
startscroll:
    If Button = 2 Then      'нажата правая кнопка мыши?
    pause_time = PAUSE_RBUTTON
    Else
    pause_time = PAUSE_LBUTTON
    End If
    intNumYear = intNumYear + 1
    If intNumYear > 9999 Then intNumYear = 9999
    lblYear = intNumYear
    'задержка
    Pause pause_time
    'проверка, не отжата ли кнопка
    If flgYearForwardBtn = False Then Exit Sub
'зацикливание
GoTo startscroll
End Sub
 
Private Sub imgYearForward_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
flgYearForwardBtn = False 'TRUE = нажата кнопка "год вперёд"
intNumYear = intNumYear - 1
'-----------------------------------------------------------------------------------------------------
Call SetDate(DateAdd("yyyy", 1, DateSerial(intNumYear, intNumMonth, intNumDay)))
'-----------------------------------------------------------------------------------------------------
End Sub
правда для изменения скорости повторов использовались разные кнопки мыши, к тому же использовался не приветствуемый переход GO TO. Может в NET есть нечто готовое, я имею в виду "акселерацию" повторов при удержании кнопки нажатой?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2016, 06:57
Ответы с готовыми решениями:

Как обнаружить факт нажатия кнопки на гарнитуре Earpods?
Samsung NP470R5E-X01RU; Windows 8.1; Гарнитура Apple EarPods MD827ZM. На ноутбуке - один разъем одновременно и под микрофон, и под...

Окно со статусбаром и кнопкой "Отмена". Как отследить событие нажатия кнопки?
Доброго времени суток, коллеги! Ситуация следующая. Из MainForm запускаю отображение второй формы (ProgressForm) На второй форме...

Как реализовать выполнение работы на нажатие кнопки Enter
Приветствую всех, подскажите как реализовать выполнение работы на нажатие кнопки Enter я ввожу вручную пароль и нажимаю кнопку на форме,...

30
Заблокирован
25.10.2016, 11:55
Цитата Сообщение от jkrnd Посмотреть сообщение
не приветствуемый переход GO TO
VB.NET
1
2
3
do
'ваш код без GOTO, метки и Exit Sub
loop while flgYearForwardBtn
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
25.10.2016, 17:04  [ТС]
Shersh, ну в этом нового немного.
Как в NET организовать задержку в n мсек?
Visual Basic
1
Pause 500
Добавлено через 28 минут
Кнопка залипает:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Imports System.Threading
Public Class Form1
    Dim fDown As Boolean        'TRUE = кнопка нажата 
    Dim i As Integer
    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
        fDown = True 'кнопка нажата 
        Do
            i += 1
            Label1.Text = i.ToString
            Thread.Sleep(500)
            Me.Refresh()
        Loop While fDown
    End Sub
    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
        fDown = False 'кнопка отпущена
    End Sub
End Class
и без инструкции Me.Refresh() не обновляется содержимое метки
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.10.2016, 20:13
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Использовать потоки

VB.NET
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
Imports System.Threading
Public Class Form1
    Dim fDown As Boolean        'TRUE = кнопка нажата 
    Private i As Integer
    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
        fDown = True 'кнопка нажата 
        Dim th As New MethodInvoker(AddressOf thAutoAction)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
 
    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
        fDown = False 'кнопка отпущена
    End Sub
 
 
    Private Sub thAutoAction()
        Do
            i += 1
            Me.Label1.Invoke(Sub() Me.Label1.Text = i.ToString())
            'Me.Label1.Invoke(New _dlg(AddressOf ShowResult), i.ToString())
            Thread.Sleep(500)
        Loop While fDown
 
    End Sub
 
 
    'Delegate Sub _dlg(ByVal txt As String)
 
    'Sub ShowResult(ByVal txt As String)
    '    Me.Label1.Text = txt
    'End Sub
 
End Class
Закомментирована другая вариация вызова метода присваивания значения из по дочернего потока

Добавлено через 37 минут
По поводу первого поста, о том что нужно частоту менять при удержании

VB.NET
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
Imports System.Threading
Public Class Form1
    Dim fDown As Boolean        'TRUE = кнопка нажата 
    Private i As Integer
 
    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
        fDown = True 'кнопка нажата 
        Dim th As New MethodInvoker(AddressOf thAutoAction)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
 
    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
        fDown = False 'кнопка отпущена
    End Sub
 
 
    Private Sub thAutoAction()
 
        Dim kfc As Integer = 40
        Dim n As Integer = 500
 
        Do
            If n < 1 Then n = 1
            i += 1
            Me.Label1.Invoke(Sub() Me.Label1.Text = i.ToString())
            'Me.Label1.Invoke(New _dlg(AddressOf ShowResult), i.ToString())
            Thread.Sleep(n)
            n -= kfc
        Loop While fDown
 
    End Sub
 
 
    'Delegate Sub _dlg(ByVal txt As String)
 
    'Sub ShowResult(ByVal txt As String)
    '    Me.Label1.Text = txt
    'End Sub
 
End Class
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
25.10.2016, 20:30  [ТС]
Sklifosofsky, Всё работает. Спасибо. Неужели без заморочек с потоками никак не обойтись? На VB-6 всё работало и без них. Немного непонятно как попробовать то, что закомментировано (Delegate Sub...). Если не трудно подскажите как реализовать следующее: через 2 сек после нажатия и удержания кнопки увеличить скорость повторов (уменьшить значение аргумента функции Sleep в 2 раза). А если кнопка не одна?

Не по теме:

С потоками работать опасно. Я недавно при работе с Com-портом вместо цикла таймера попытался использовать потоки, вроде всё то же самое (почти) и визуально ошибок нет. Но в приборе, передающем данные опять что-то глюкнуло, пошли нештатки и меня отлучили от церкви:(



Добавлено через 2 минуты
Sklifosofsky, пока писал вопрос получил ответ, спасибо

Добавлено через 8 минут
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
Me.Label1.Invoke(Sub() Me.Label1.Text = i.ToString())
и всё-таки хотелось бы знать что же происходит в этой строке.

Добавлено через 1 минуту
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
Me.Label1.Invoke(New _dlg(AddressOf ShowResult), i.ToString())
и здесь вообще не понятно что делается, хотя всё прекрасно работает.
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.10.2016, 20:54
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
и здесь вообще не понятно что делается, хотя всё прекрасно работает.
На net 2.0 только так можно общаться из под дочернего потока с основным.
Это пример с объявленным делегатом, причем упрощённый. По логике лучше объявление делать до работы функции (я просто чешусь, когда знаю, что при цикличной работе создается и тут же удаляется локальная переменная).
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    ' ...
    Private Delegate Sub _dlg(ByVal txt As String)
    Private CallBack As New _dlg(AddressOf ShowResult)
 
    Private Sub thAutoAction()
 
        Dim kfc As Integer = 40
        Dim n As Integer = 500
 
        Do
            If n < 1 Then n = 1
            i += 1
            'Me.Label1.Invoke(Sub() Me.Label1.Text = i.ToString())
            'Me.Label1.Invoke(New _dlg(AddressOf ShowResult), i.ToString())
            Me.Label1.Invoke(CallBack, i.ToString())
            Thread.Sleep(n)
            n -= kfc
        Loop While fDown
 
    End Sub
 
    Sub ShowResult(ByVal txt As String)
        Me.Label1.Text = txt
    End Sub

И еще про потоки. Thread.Sleep - это не отсечка, а метод останавливающий поток на определенное время. Причем останавливается не только действие метода в котором он находится, но и все процессы потока, в том числе анимация формы... По этому лучше такие костыли вытворять в дочернем потоке, который не трогает основной. Единственное исключение, это когда надо вызвать метод и передать переменные в основное поток с формой, использовать Control.Invoke([делегат], [переменные])

Не по теме:

А про опасность потоков... Ну не знаю. Главное правильно подойти к этому вопросу=) И как сказал Альф: "Вы не любите кошек? Да вы просто не умеете их готовить! "

1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
25.10.2016, 21:01  [ТС]
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
Me.Label1.Invoke(New _dlg(AddressOf ShowResult), i.ToString()
я заменил на
VB.NET
1
Me.Invoke(New _dlg(AddressOf ShowResult), i.ToString())
то есть без <Label1>. Всё работает. Так можно делать?
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.10.2016, 21:09
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Можно. Они в одном потоке
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
25.10.2016, 21:23  [ТС]
Sklifosofsky, Остановился на следующем варианте с двумя кнопками (Increment и Decrement):
VB.NET
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
Imports System.Threading
Public Class Form1
    Dim fDownInc As Boolean         'TRUE = кнопка Increment нажата 
    Dim fDownDec As Boolean         'TRUE = кнопка Decrement нажата 
    Private i As Integer            'переменная для визуализации происходящего
    Private Delegate Sub _dlg(ByVal val As Integer)
    Private CallBack As New _dlg(AddressOf ShowResult)
 
    Private Sub btnIncrement_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIncrement.MouseDown
        fDownInc = True 'кнопка нажата 
        Dim th As New MethodInvoker(AddressOf thAutoActionInc)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
    Private Sub btnIncrement_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIncrement.MouseUp
        fDownInc = False 'кнопка отпущена
    End Sub
    Private Sub thAutoActionInc()
        Dim count As Integer = 0 'считаем количество прошедших циклов с длинной паузой
        Static n As Integer = 0
        Do
            i += 1
            Me.Invoke(CallBack, i)
            If count > 2 Then
                n = 50      'короткая пауза
            Else
                n = 400     'длинная пауза
                count += 1
            End If
            Thread.Sleep(n)
        Loop While fDownInc
    End Sub
    Private Sub btnDecrement_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnDecrement.MouseDown
        fDownDec = True 'кнопка нажата 
        Dim th As New MethodInvoker(AddressOf thAutoActionDec)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
    Private Sub btnDecrement_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnDecrement.MouseUp
        fDownDec = False 'кнопка отпущена
    End Sub
    Private Sub thAutoActionDec()
        Dim count As Integer = 0 'считаем количество прошедших циклов с длинной паузой
        Static n As Integer = 0
        Do
            i -= 1
            Me.Invoke(CallBack, i)
            If count > 2 Then
                n = 50      'короткая пауза
            Else
                n = 400     'длинная пауза
                count += 1
            End If
            Thread.Sleep(n)
        Loop While fDownDec
    End Sub
    Sub ShowResult(ByVal val As Integer)
        Me.Label1.Text = i.ToString 'или равнозначное: Me.Label1.Text = val.ToString
    End Sub
End Class
Всё работает, но как же всё сложно и запутано.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
27.10.2016, 02:17
а если вместо потоков использовать таймер, созданный динамически или в дизайнере, не важно... И регулироыка скорости будет как раз его свойство Interval...? И код будет проще, пусть не столь профессионален... Но все же как вариант
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
27.10.2016, 09:23  [ТС]
Yury Komar, Наверное это должно выглядеть так:
VB.NET
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
Public Class Form1
    Dim fDownInc As Boolean         'TRUE = кнопка Increment нажата 
    Dim fDownDec As Boolean         'TRUE = кнопка Decrement нажата 
    Private i As Integer            'переменная для визуализации происходящего
    Private Sub btnIncrement_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIncrement.MouseDown
        fDownInc = True 'кнопка нажата 
        Dim tmr1 As New Timer With {.Enabled = True}
        AddHandler tmr1.Tick, AddressOf tmr1_Tick
    End Sub
    Private Sub btnIncrement_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIncrement.MouseUp
        fDownInc = False 'кнопка отпущена
    End Sub
    Private Sub tmr1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Static count As Integer = 0 'считаем количество прошедших циклов с длинной паузой
        If count > 2 Then
            sender.Interval = 50      'короткая пауза
        Else
            sender.Interval = 400     'длинная пауза
            count += 1
        End If
        If fDownInc Then
            i += 1
            Label1.Text = i.ToString
        Else
            count = 0
            sender.Stop()
            sender.Dispose()
        End If
    End Sub
    Private Sub btnDecrement_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnDecrement.MouseDown
        fDownDec = True 'кнопка нажата 
        Dim tmr2 As New Timer With {.Enabled = True}
        AddHandler tmr2.Tick, AddressOf tmr2_Tick
    End Sub
    Private Sub btnDecrement_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnDecrement.MouseUp
        fDownDec = False 'кнопка отпущена
    End Sub
    Private Sub tmr2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Static count As Integer = 0 'считаем количество прошедших циклов с длинной паузой
        If count > 2 Then
            sender.Interval = 50      'короткая пауза
        Else
            sender.Interval = 400     'длинная пауза
            count += 1
        End If
        If fDownDec Then
            i -= 1
            Label1.Text = i.ToString
        Else
            count = 0
            sender.Stop()
            sender.Dispose()
        End If
    End Sub
End Class
А что быстрее и меньше ресурсов занимает?
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
29.10.2016, 18:23
jkrnd, поставьте временнЫе отсечки до и после операции, и сравните полученные TimeSpan
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
07.11.2016, 20:40
думаю быстрее будет конечно поток, но веди таймер сделан на основе отдельгого потока вроде, если не ошибаюсь?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
18.11.2016, 18:34  [ТС]
Добрый вечер.
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
пример с объявленным делегатом
Подскажите пожалуйста почему работая с потоками я не стартую и не прерываю его. Абсолютно не понимаю как это работает. Вот простой работающий пример, основанный на Вашем коде:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Imports System.Threading
Public Class Form1
    Private Delegate Sub _dlg(ByVal val As Integer)
    Private CallBack As New _dlg(AddressOf ShowResult)
    Private Sub thExec()
        For i As Integer = 0 To 5
            Me.Invoke(CallBack, i)
            Thread.Sleep(200)
        Next i
    End Sub
    Sub ShowResult(ByVal val As Integer)
        Label1.Text = val.ToString
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim th As New MethodInvoker(AddressOf thExec)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
End Class
это конечно не по теме, но раз уж зацепились за потоки, хотелось бы разобраться
если можно, прокомментируйте код
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
18.11.2016, 19:15
Старт асинхронного потока начинается вот с этой строки
VB.NET
1
th.BeginInvoke(Nothing, Nothing)
Проверить это можно посмотрев индексы потоков в разных методах
VB.NET
1
MsgBox(Threading.Thread.CurrentThread.ManagedThreadId)
(Вставить в метод с кнопкой и thExec)

Поток завершается автоматически, после завершения работы метода thExec.

Схема работы:
Вызов метода нажатия кнопки;
Создается экземпляр класса делегата;
Вызов асинхронный поток .BeginInvoke;
Параллельно начинает работу метод thExec;
Завершается метод нажатия кнопки (Не зависимо работает thExec или нет, он уже в другом потоке);
Основной поток (где форма, компоненты и т.д) работает как ни в чем не бывало;
В thExec есть метод (вклинивания) передачи данных в основной поток Control.Invoke. (Образно, как будто посторонний человек нажал вашу кнопку);
После завершения цикла, метод прекращает свою работу без вызова других методов и асинхронный поток завершает свою работу.
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
18.11.2016, 20:17  [ТС]
Sklifosofsky, Спасибо. Уже проясняется что-то. Если Sleep сделать чуть подольше и закрыть окно программы до завершения цикла во втором потоке, то получаем ошибку:
"Доступ к ликвидированному объекту невозможен." Как это исключить в приведенном выше коде?
А можно Me.Invoke(CallBack, i) вызвать без второго параметра (Me.Invoke(CallBack)) организовав в ShowResult статическую переменную со сбросом?
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
18.11.2016, 20:34
Цитата Сообщение от jkrnd Посмотреть сообщение
Как это исключить в приведенном выше коде?
VB.NET
1
2
3
4
5
6
Try
     '[код]
Catch
     '...
     Exit Sub
End Try
Цитата Сообщение от jkrnd Посмотреть сообщение
А можно Me.Invoke(CallBack, i) вызвать без второго параметра (Me.Invoke(CallBack)) организовав в ShowResult статическую переменную со сбросом?
Можно, но уже это перестает быть потокобезопасным. Если к этой переменной будет обращаться другой метод одновременно - может произойти ошибка...
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
18.11.2016, 20:44  [ТС]
Sklifosofsky, Спасибо!
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
18.11.2016, 20:48
Уточню по поводу ошибки при статической переменной. Насчет примитивов не знаю, не попадал, но было дело при работе с экземплярами классов
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
18.11.2016, 20:57  [ТС]
Sklifosofsky, а вот эти две строки как прокомментировать:
VB.NET
1
2
    Private Delegate Sub _dlg(ByVal val As Integer)
    Private CallBack As New _dlg(AddressOf ShowResult)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2016, 20:57
Помогаю со студенческими работами здесь

Разрешение нажатия кнопки
Здравствуйте форумчане ! Подскажите пожалуйста лучше конечно на примере, как сделать так чтобы кнопку на форме можно было нажать только...

Перехват нажатия кнопки с клавиатуры
Подскажите как сделать что бы программа перехватывала нажатие кнопки F3 даже если форма не активна и программа свернута? Так у меня...

Эмуляция нажатия кнопки в WebBrowser
Чет затупил, не могу эмулировать нажатия кнопки &lt;input type=&quot;button&quot; class=&quot;edcbtn btn btn130&quot; value=&quot;Редактировать&quot;...

Изменение обработчика нажатия кнопки, как реализовать?
Всем привет! Задача: в листе Ексела копируется уже созданная кнопка (с обработчиком ее нажатия) после копирования у вновь созданной...

Как реализовать изменения внутри окна после нажатия некой кнопки?
Всем доброго времени суток. Небольшая проблема. Худо бедно разобрался с Windows forms на c++, теперь интересует вопрос: как реализовать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru