Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310

Приложение не видно в трее и панели задач, главная форма вызывается горячими клавишами

23.07.2011, 23:37. Показов 6516. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Иногда необходимо, чтобы программа не висела ни в трее, ни на панеле задач, а делала свою работу тихо. Главное, чтобы можно было получить к ней доступ в любой момент нажааав, ну например кёнтр+альт+щ. И чтобы форма ещё на экране постоянно не висела.
P.S Хочу добавить в программу Ciberst "In tray" функцию, что бы она стартовала с автозагрузкой(но это я делать умею) и что бы она даже в трее не светилась, а я мог просто получить к ней доступ с помощью гор клавиш.
P.S.S Главное чтобы в Диспетчере осталась, а то мало ли что=))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.07.2011, 23:37
Ответы с готовыми решениями:

Как развернуть приложение горячими клавишами
Здравствуйте, скрываю приложение этим методом: ShowWindow(Handle,SW_HIDE); Вопрос: Как можно развернуть приложение горячими...

Проблема с горячими клавишами
При запуске нескольких экземпляров программы, функции горячих клавиш (Открытие блокнота, закрытие программы) работают исправно, пока не...

DLL с горячими клавишами
Привет всем. У меня есть программа, которая напоминает о событиях. При нажатие на некоторые клавиши, она открывает окно и просит заполнить...

30
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
23.07.2011, 23:44
У формы отключи свойство "ShowInTaskb = False"... Она исчезнет с панели задач и при нажатии на кнопку свернуть ее не будет в трее... Но она будет висеть в дес. задач в процессах

Добавлено через 47 секунд
А насчет го. клавиши я не помню как это сделать
1
 Аватар для Devel
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
23.07.2011, 23:54
Лучший ответ Сообщение было отмечено как решение

Решение

Чтобы она делала работу тихо в своствах формы поставь ShowInTaskbar=False и в код формы поставь после

VB.NET Скопировано
1
Public Class Form1
следующее:
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
Private m_startInVisible As Boolean = True
    Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
        If m_startInVisible Then
            MyBase.SetVisibleCore(False)
            m_startInVisible = False
        Else
            MyBase.SetVisibleCore(value)
        End If
    End Sub
3
 Аватар для Desh
147 / 147 / 41
Регистрация: 01.12.2009
Сообщений: 275
23.07.2011, 23:58
По поводу горячих клавиш ...

VB.NET Скопировано
1
2
3
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
 If e.Control = True And e.KeyCode = Keys.Q Then MsgBox("Нажата Control и Q") ' Если нажата клавиша Contro(вместо неё можно написать Alt или Shift) и Q то выдаем сообщение
 End Sub
свойство KeyCode не умеет обрабатывать русские буквы. Для обработки русских и прописных букв надо использовать событие KeyPress и свойство KeyChar. Вот код:

VB.NET Скопировано
1
2
3
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
 If e.KeyChar = "п" Then MsgBox("Нажата клавиша: п") ' Если нажата клавиша 'п' то выводим сообщение
 End Sub
взято отсюда
1
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
24.07.2011, 00:02
Цитата Сообщение от Desh Посмотреть сообщение
По поводу горячих клавиш ...

VB.NET Скопировано
1
2
3
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
 If e.Control = True And e.KeyCode = Keys.Q Then MsgBox("Нажата Control и Q") ' Если нажата клавиша Contro(вместо неё можно написать Alt или Shift) и Q то выдаем сообщение
 End Sub
свойство KeyCode не умеет обрабатывать русские буквы. Для обработки русских и прописных букв надо использовать событие KeyPress и свойство KeyChar. Вот код:

VB.NET Скопировано
1
2
3
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
 If e.KeyChar = "п" Then MsgBox("Нажата клавиша: п") ' Если нажата клавиша 'п' то выводим сообщение
 End Sub
взято отсюда
Этот метод не даст результатов если фокуса на проге (самой формы) не будет... Сейчас проверил ... Или мб я что то не дописал?
0
 Аватар для Devel
91 / 46 / 2
Регистрация: 02.11.2010
Сообщений: 261
24.07.2011, 00:04
Treals, ты все дописал и полностью прав. Если нет фокуса, нет MsgBox
Desh, так что лажа твоя идея
1
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.07.2011, 00:39
да..я тоже интересовался этим вопросом и не раз..но к сожалению ничего хорошего так и не нашел..
Есть способ с использованием апи функций..Так называемый перехват клавиш(хук)

ОН довольно таки замороченный, поэтому приводить не буду, но вот вариант попроще и в принципе рабочий..но все это конечно не красиво и не практично

VB.NET Скопировано
1
2
3
4
 Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If GetAsyncKeyState(Keys.Q) And GetAsyncKeyState(Keys.R) Then Me.BackColor = Color.Black : sender.Stop()
    End Sub
0
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
24.07.2011, 00:49
Как я понял... Этот код действует так:
Есть таймертик... В нем заданно время допустим 5с... Если по достижению этих 5с зажатки кнопки "Q" и "R" тогда цвет меняется...
Этот вариант думаю тоже не годится да и в нем много багов будет
0
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.07.2011, 01:17
какие еще баги?
Таймер работает постоянно и опрашивает апи функцию на то были ли нажаты конкретные клавиши, вот и все....Баг только в том что постоянно работает таймер и опрашивает функцию...

Не знаю даже но наверно будет лучше если модераторы сотрут это сообщение, по крайней мере мой антивирус попытался сделать именно так (после того как я создал проект с этим кодом), поэтому копируй быстрее

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
 Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const WM_KEYUP As Integer = &H101
    Private Shared _proc As LowLevelKeyboardProc = AddressOf HookCallback
    Private Shared _hookID As IntPtr = IntPtr.Zero
 
    Public Declare Auto Function SetWindowsHookEx Lib "user32.dll" ( _
         ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
 
    Public Declare Auto Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hhk As IntPtr) As IntPtr
 
    Public Declare Auto Function CallNextHookEx _
     Lib "user32.dll" (ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
 
    Public Declare Auto Function GetModuleHandle Lib "kernel32.dll" (ByVal lpModuleName As String) As IntPtr
 
 
    Private Shared Function SetHook(ByVal proc As LowLevelKeyboardProc) As IntPtr
        Dim curProcess As Process = Process.GetCurrentProcess()
        Dim curModule As ProcessModule = curProcess.MainModule
        Return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0)
    End Function
 
    Public Delegate Function LowLevelKeyboardProc( _
         ByVal nCode As Integer, ByVal wParam As IntPtr, _
         ByVal lParam As IntPtr) As IntPtr
 
    Public Shared Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        If nCode >= 0 And wParam = CType(WM_KEYUP, IntPtr) Then
            Dim vkCode As Keys = CType(Marshal.ReadInt32(lParam), Keys)
            If vkCode = Keys.LWin Or vkCode = Keys.RWin Then
                MsgBox("d")
                'keybd_event(CByte(Keys.Zoom), 0, KEYEVENTF_EXTENDEDKEY, 0)
            End If
        End If
        Return CallNextHookEx(_hookID, nCode, wParam, lParam)
    End Function
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _hookID = SetHook(_proc)
    End Sub
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
24.07.2011, 01:20
Хуки - дело неблагородное
0
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.07.2011, 01:22
Цитата Сообщение от Ciberst Посмотреть сообщение
Хуки - дело неблагородное
мне тоже это не нравится, но бывают ситуации когда нужно, а не как по другому не выходит...


Ciberst, А почему ты так думаешь?
0
 Аватар для Desh
147 / 147 / 41
Регистрация: 01.12.2009
Сообщений: 275
24.07.2011, 02:50
Вот тут есть рабочий пример.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8724 / 3676 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.07.2011, 04:01
Цитата Сообщение от Ciberst Посмотреть сообщение
Хуки - дело неблагородное
Конечно, когда использовать их где не надо и через одно место. Для горячих клавиш используйте RegisterHotKey, примеры есть в разделе C#.
2
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
24.07.2011, 08: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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
mports System.Runtime.InteropServices
Public Class Form1
    Implements IDisposable
    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Dim k As Keys = Keys.A Or Keys.Control 
'регистрируем горячую клавишу
        WindowsShell.RegisterHotKey(Me, k)
    End Sub
 
    ' CF Note: The WndProc is not present in the Compact Framework (as of vers. 3.5)! please derive from the MessageWindow class in order to handle WM_HOTKEY
    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m) 
'здесь мы получаем событие принажатии горячей клавиши
        If m.Msg = WindowsShell.WM_HOTKEY Then 
 
            Me.WindowState = FormWindowState.Normal
            Me.Activate()
        End If
    End Sub
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
             'не забываем снять регистрацию)
        WindowsShell.UnregisterHotKey(Me)
    End Sub
End Class
Public Class WindowsShell
#Region "fields"
    Public Shared MOD_ALT As Integer = &H1
    Public Shared MOD_CONTROL As Integer = &H2
    Public Shared MOD_SHIFT As Integer = &H4
    Public Shared MOD_WIN As Integer = &H8
    Public Shared WM_HOTKEY As Integer = &H312
#End Region
 
    <DllImport("user32.dll")> _
    Private Shared Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vlc As Integer) As Boolean
    End Function
 
    <DllImport("user32.dll")> _
    Private Shared Function UnregisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
    End Function
 
    Private Shared keyId As Integer
    Public Shared Sub RegisterHotKey(ByVal f As Form, ByVal key As Keys)
        Dim modifiers As Integer = 0
 
        If (key And Keys.Alt) = Keys.Alt Then
            modifiers = modifiers Or WindowsShell.MOD_ALT
        End If
 
        If (key And Keys.Control) = Keys.Control Then
            modifiers = modifiers Or WindowsShell.MOD_CONTROL
        End If
 
        If (key And Keys.Shift) = Keys.Shift Then
            modifiers = modifiers Or WindowsShell.MOD_SHIFT
        End If
 
        Dim k As Keys = key And Not Keys.Control And Not Keys.Shift And Not Keys.Alt
        keyId = f.GetHashCode()
        ' this should be a key unique ID, modify this if you want more than one hotkey
        RegisterHotKey(DirectCast(f.Handle, IntPtr), keyId, CUInt(modifiers), CUInt(k))
    End Sub
 
    Private Delegate Sub Func()
 
    Public Shared Sub UnregisterHotKey(ByVal f As Form)
        Try
            ' modify this if you want more than one hotkey
            UnregisterHotKey(f.Handle, keyId)
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub
End Class
ctrl + A - разворачивает форму и передает фокус

для того чтобы отловить
ctrl+alt+Щ
замени
VB.NET Скопировано
1
Dim k As Keys = Keys.A Or Keys.Control
на
VB.NET Скопировано
1
Dim k As Keys = Keys.O Or Keys.Control Or Keys.Alt
Добавлено через 15 минут
Цитата Сообщение от eJ_Studio Посмотреть сообщение
Ciberst, А почему ты так думаешь?

Не по теме:

неправильное использование, может замедлить производительность компьютера.
когда я ставил хук на клаву, то имел проблему с такой программой как Punto Switcher(она тоже ставит хук на клаву), либо переставала работать, либо работала, но плохо.
Я думаю, что и сам Windows при каждом запуске, запускает сам несколько своих хуков, иначе, как бы бы мы печатали? как бы мышкой пользовались? и тд. и тп.

Поэтому, раз ставить хук , то это при большой необходимости и когда без него нельзя, в данном случае, чтобы отловить горячие клавиши, использовать хук - неудачное решение.

6
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.07.2011, 08:48
Цитата Сообщение от Treals Посмотреть сообщение
У формы отключи свойство "ShowInTaskb = False".
А зачем вообще создавать форму? Задача: сделать прогу без формы. Предлагаемое решение: создать форму и мучиться с её сокрытием. Вопрос: нафига?
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
24.07.2011, 08:50
вопрос:
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем вообще создавать форму? Задача: сделать прогу без формы. Предлагаемое решение: создать форму и мучиться с её сокрытием.
ответ:
Цитата Сообщение от Provaider Посмотреть сообщение
Главное, чтобы можно было получить к ней доступ в любой момент нажааав, ну например кёнтр+альт+щ. И чтобы форма ещё на экране постоянно не висела.
0
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
24.07.2011, 16:33
Ciberst, за код на гор. клавиши спасибо ... Интересный метод

Добавлено через 1 час 24 минуты
Вот тока у меня вопрос... Как еще одну ввести гор. клавижу?
0
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.07.2011, 19:37
Treals, я как бы тоже вариант кидал
а если серьезно то тебе нужно в этой строчке как я понял разбираться что бы ввести еще одну гор. клавишу
VB.NET Скопировано
1
  RegisterHotKey(DirectCast(f.Handle, IntPtr), keyId, CUInt(modifiers), CUInt(k))
Добавлено через 2 минуты
кстати...не плохой вариант
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
24.07.2011, 20:13
Treals, в том коде есть строчка,
VB.NET Скопировано
1
Dim k As Keys = Keys.O Or Keys.Control Or Keys.Al
вот три кнопки, или ты про то чтобы у программы было несколько горячих клавиш (например ctrl+a, ctrl+m и тд)?
0
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
24.07.2011, 23:15
Да, что бы разные были
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2011, 23:15
Помогаю со студенческими работами здесь

Работа с горячими клавишами
Добрый день. Есть такая проблема.я в приложении регистрирую горячие клавиши, по нажатию которых открываются окна/выполняются функции. ...

Чтобы форма (иконка форма) не показывалась в панели задач Windows
как сделать так чтобы форма (иконка форма) не показывалась в панели управления там где пуск и все дела?

Секундомер с тремя горячими клавишами
Здравствуйте. Задача: реализовать секундомер с тремя горячими клавишами Q - старт W - стоп E - сброс В итоге W работает, а Q и E...

Управление громкостью горячими клавишами
Ноутбук - Lenovo Ideapad G700. При покупке стояла Windows 8.1 Single Language, снесла ее, установила Windows 7 Ultimate. Установила все...

Терминал не запускается горячими клавишами
Доброго времени! Перестал запускаться терминал (в моем случае консоль) при нажании клавиш Ctrl+Alt+T. После чего произошло не заметил. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер