powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Включение NumLock при открытии формы
25 сообщений из 31, страница 1 из 2
Включение NumLock при открытии формы
    #38905598
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для того чтобы включить NumLock использую следующий код, но мне надо сделать чтобы не просто циклично включалась - выключалась NumLock , а включалась только при выключенном состоянии.
Код: vbnet
1.
2.
3.
4.
Private Sub Form_Load()
If GetNumlock <> True Then Call SetNumlock(True)
SendKeys "{F11}", False
End Sub



Код: vbnet
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.
Option Compare Database
Option Explicit

Private Declare Function LoadKeyboardLayout Lib "user32" Alias _
 "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
 
'для NumLock-----------------
Private Const vbKeyScrollLock = &H91
Private Const vbKeyNumlock = &H90

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
'для NumLock-----------------

Function Keyboard()

'Переключение на английскую раскладку
'Call LoadKeyboardLayout("00000409", &H1)

'Переключение на русскую раскладку
Call LoadKeyboardLayout("00000419", &H1)

End Function

Public Sub SetNumlock(Value As Boolean)
    ' Return or set the Numlock toggle.
    Call SetKeyState(vbKeyNumlock, Value)
End Sub

Public Function GetNumlock() As Boolean
    ' Return or set the Numlock toggle.
    GetNumlock = CBool(GetKeyState(vbKeyNumlock) And 1)
End Function

Public Sub SetKeyState(intKey As Integer, fTurnOn As Boolean)
    ' Retrieve the keyboard state, set the particular
    ' key in which you're interested, and then set
    ' the entire keyboard state back the way it
    ' was, with the one key altered.
Dim abytBuffer(0 To 255) As Byte
    GetKeyboardState abytBuffer(0)
    abytBuffer(intKey) = CByte(Abs(fTurnOn))
    SetKeyboardState abytBuffer(0)
End Sub
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38905608
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверно можно сделать проще :)
Код: vbnet
1.
2.
3.
4.
5.
Private Sub Form_Load()

SendKeys "{NUMLOCK}"

End Sub
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38905611
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но опять же нужна проверка на уже включенный "{NUMLOCK}" чтобы его не выключал
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38905663
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
intersk,

раз и навсегда...
ищи по контексту параметр InitialKeyboardIndicators и делай 2
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38906028
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag, спасибо, но всё равно хотелось бы понять как работать с NumLock через VBA. Почему код который указан в первом сообщении просто циклично включает-выключает NumLock, а не только включает.
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38906753
vmag_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
intersk,

можно так (модуль формы, общих модулей не нужно....):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Option Compare Database
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Private Sub Кнопка3_Click()
Dim WsNumlock As Variant
Select Case GetKeyState(vbKeyNumlock)
Case 0 ' не включен, включаем...
   Set WsNumlock = CreateObject("WScript.Shell")
   WsNumlock.SendKeys "{NUMLOCK}"
   MsgBox "Готово!"
Case 1 'включен, сообщаем...
   MsgBox "NumLock уже был включен!"
End Select
End Sub



Единственное, сначала у меня было состояние, что наоборот 0 - включен, 1 - выключен, но я подозреваю, что это были последствия
проверки вашего примера... ибо после перезагрузки компа стало по человечески (0- выключено, 1 - включено)... :-))
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38906795
vmag_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах да... нужно ж при открытии формы...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Option Compare Database
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Dim WsNumlock As Variant

Private Sub Form_Open(Cancel As Integer)
If GetKeyState(vbKeyNumlock) = 0 Then
Set WsNumlock = CreateObject("WScript.Shell")
WsNumlock.SendKeys "{NUMLOCK}"
End If
End Sub
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907145
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag_Единственное, сначала у меня было состояние, что наоборот 0 - включен, 1 - выключен, но я подозреваю, что это были последствия проверки вашего примера... ибо после перезагрузки компа стало по человечески (0- выключено, 1 - включено)... :-)) да и у меня тоже это было, поэтому сам, со своим минимумом знаний понять не мог почему так )
ваш пример - то что нужно!

а вы могли бы ещё помочь с переключением языка?
у меня сейчас такой код, но иногда он не срабатывает

Код: vbnet
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.
Option Compare Database
Option Explicit

Private Declare Function LoadKeyboardLayout Lib "user32" Alias _
 "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
 


Function Keyboard()

Option Compare Database
Option Explicit

Private Declare Function LoadKeyboardLayout Lib "user32" Alias _
 "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
 

Function Keyboard()

'Переключение на английскую раскладку
'Call LoadKeyboardLayout("00000409", &H1)

'Переключение на русскую раскладку
Call LoadKeyboardLayout("00000419", &H1)

End Function

End Function
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907148
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag_,
исправил сообщение
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Option Compare Database
Option Explicit

Private Declare Function LoadKeyboardLayout Lib "user32" Alias _
 "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
 
Function Keyboard()

'Переключение на английскую раскладку
'Call LoadKeyboardLayout("00000409", &H1)

'Переключение на русскую раскладку
Call LoadKeyboardLayout("00000419", &H1)

End Function
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907388
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
intersk,
В этом примере при старте формы будет всегда русская раскладка, если нужно наоборот, то заремить/оремить...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Compare Database
Option Explicit
Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
Dim klava As Variant

Private Sub Form_Open(Cancel As Integer)
klava = LoadKeyboardLayout("00000419", &H1) 'русская
'klava = LoadKeyboardLayout("00000409", &H1) 'английская
End Sub



И хочу дать вам один совет - используйте процедуры и функции (Sub и Function) так как их использую я
мне тоже некогда читать умную литературу (главную дорогу и помеху справа знаешь - можно ехать):
- в процедуру можно при вызове передавать параметры, но обратно получить их нельзя, можно только
внутри процедуры изменять глобальные переменные, а после её завершения прочитать эти переменные.
- процедуру я вызываю Сall Имя, если она с параметрами, то Сall Имя (p1,p2,...)
- функция обязательно возвращает один параметр , и в неё можно передать параметры как в процедуре,
плюс в ней тоже можно менять глобальные переменные.
ВСЁ...

Никакие другие частные случаи (как бы и что бы мне не рассказывали) - меня просто не интересуют и мне
на них просто насрать...

LoadKeyboardLayout Lib это функция ? Возвращает Long ? (смотри последнее слово)
ну так я и беру это значение в переменную:
klava = LoadKeyboardLayout("00000419", &H1)
Хотя что там будет после этого в klava 1, 0, 100... мне абсолютно по барабану...
Да, я не особо умный, но мне хватает...
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907415
43210
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag- в процедуру можно при вызове передавать параметры, но обратно получить их нельзя, можно только
внутри процедуры изменять глобальные переменные, а после её завершения прочитать эти переменные.Шта?
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907434
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag...в процедуру можно при вызове передавать параметры, но обратно получить их нельзя...И для тебя тоже 17385432
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907442
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\\\\,
Ещё раз:
Никакие другие частные случаи (как бы и что бы мне не рассказывали) - меня просто не интересуют...
Мне уже учиться и переучиваться поздно...
Всем остальным - на здоровье...
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907448
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag- в процедуру можно при вызове передавать параметры, но обратно получить их нельзя, можно только
внутри процедуры изменять глобальные переменные, а после её завершения прочитать эти переменные.
- процедуру я вызываю Сall Имя, если она с параметрами, то Сall Имя (p1,p2,...)
- функция обязательно возвращает один параметр, и в неё можно передать параметры как в процедуре,
плюс в ней тоже можно менять глобальные переменные.
ВСЁ...
Обожаю подобные откровения...
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907474
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
interskа вы могли бы ещё помочь с переключением языка?Код не нужен. У контролов текстбокс и комбобокс есть свойство "язык клавиатуры" ( KeyboardLanguage ). Выстави там нужный тебе язык ввода.
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907515
43210
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmagЕщё раз:
Никакие другие частные случаи (как бы и что бы мне не рассказывали) - меня просто не интересуют...
Мне уже учиться и переучиваться поздно...
Всем остальным - на здоровье...Учитывая, что ByVal и ByRef вроде бы равноправны, но при этом "ByRef is the default in Visual Basic", спорно, что есть (более) частный случай.

Жжёте напалмом.

P.S. Первую программу написал и отладил на "Электронике 100-25" (клон PDP-11/40) в 1987 году. Учиться и переучиваться никогда не поздно - организм должен реагировать на изменения окружающей среды.
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907546
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
43210Учитывая, что ByVal и ByRef вроде бы равноправны, но при этом "ByRef is the default in Visual Basic", спорно, что есть (более) частный случай.

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

Вот я и есть тот хлопчик со списочком и мине ничо дописывать не нужно...
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907566
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag43210Учитывая, что ByVal и ByRef вроде бы равноправны, но при этом "ByRef is the default in Visual Basic", спорно, что есть (более) частный случай.

Эх... вот признаюсь честно... даже не понимаю о чем выше речь... но как-то чувствую, что это мне не нужно...
Существуют два способа, которыми VBA передает информацию в функцию-процедуру: по ссылке и по значению.

По умолчанию VBA передает все аргументы по ссылке. При передаче данных функции посредством аргумента по ссылке VBA, на самом деле, передает только адрес памяти, который ссылается на исходные данные, определенные в списке аргументов функции во время вызова функции. Это означает, что если функция изменяет значения в любом из аргументов, исходные данные, переданные функции посредством этого аргумента, также изменяются.

При передаче аргумента по значению VBA создает копию исходных данных и передает эту копию функции. Если функция изменяет значение в аргументе, передаваемом по значению, изменяется только копия данных; исходные данные не изменяются. Передача по ссылке позволяет с помощью функции изменять исходные данные, передаваемые функции посредством аргумента; передача же по значению не позволяет изменять значение исходных данных.

Поскольку передача по ссылке позволяет функции изменять значение исходных данных ее аргументов, аргументы, передаваемые по ссылке, могут получить нежелательные побочные значения.
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907599
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag, всё что вы предлагаете просто и работает! это самое нужное сочетание. И знания ваши достойные. Вы практик, а не теоретик
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38907601
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\interskа вы могли бы ещё помочь с переключением языка?Код не нужен. У контролов текстбокс и комбобокс есть свойство "язык клавиатуры" ( KeyboardLanguage ). Выстави там нужный тебе язык ввода. а то я не знаю )))) у меня на формах от 10 до 30 контролов - сам выделяй их все и потом в ручную указывай свойство языка, а если учесть что свою базу постоянно дорабатываю и добавляю или удаляю поля то ... спасибо vmag
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38914430
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag, этот код работает нестабильно (

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
 
Public Function KeyboardNumLock()
 
Dim WsNumlock As Variant
 
If GetKeyState(vbKeyNumlock) = 0 Then
    Set WsNumlock = CreateObject("WScript.Shell")
    WsNumlock.SendKeys "{NUMLOCK}"
End If
 
End Function



вот что нашел в интернете на другом форуме (может как-то можно использовать эту информацию). Речь идет о каком- то состоянии стабильном или нестабильном...поэтому иногда numlock то включается, то не включается

=================================================
И все-таки это возможно.

Коротко и с готовым примером (файл прилагается).

Перед
Код

Код: vbnet
1.
Application.SendKeys "%{DOWN}"


надо выполнить
Код

Код: vbnet
1.
If Num_Not_Stable() Then Application.SendKeys "{NUMLOCK}"


и NumLock меняться не будет.

В листе:
Код

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim lValidation As Long
     
    If Num_Not_Stable() Then Application.SendKeys "{NUMLOCK}" ' делает NumLock стабильным
     
    On Error Resume Next
      lValidation = ActiveCell.Validation.Type
    On Error GoTo 0
    If lValidation = 3 Then Application.SendKeys "%{DOWN}"
End Sub



В модуле книги:
Код

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
 
' Определяет, изменчивое ли состояние у NumLock или нет
' Возвращает false - стабильный, true - изменчевый
Function Num_Not_Stable() As Boolean
 
    Dim keystat(0 To 255) As Byte
    Dim state As String
     
    GetKeyboardState keystat(0)
    state = keystat(vbKeyNumlock)
     
    If (state = 0) Then
     Num_Not_Stable = False
    Else
     Num_Not_Stable = True
    End If
End Function



Теперь рассуждения что, и как работает.

Посмотрев по предложенным ссылкам и многим другим источникам, убедился- все это шляпа. И она не работает.
Я не то что не гуру, использую VBA около месяца. Потому, все что ниже (и выше, не счет "шляпы" ;) может не соответствовать истине.
Кроме того, что бы придти к этому способу я сознательно подменил стандартные понятия своими, заведомо не верными, но работающими в данном контексте.

И так.
Первое понятие: команда {NUMLOCK} не посылает сигнал "нажать NumLock", а закрепляет NumLock, если он "изменчивый".

"Изменчивый" - это когда он меняет свое состояние, когда не должен, например при команде %{DOWN} которая по идее должна только сымитировать Alt+Down.

Экспериментальным путем выяснил, что NumLock имеет "стабильное" состояние и "изменчивое". Не путать с "включен" и "выключен", в любом из них он может быть как "изменчивым" так и "стабильным".

Второе понятие: строчки
GetKeyboardState keystat(0)
state = keystat(vbKeyNumlock)
определяют не текущее состояние NumLock, а его текущую стабильность. Если state = 0, то NumLock стабилен, иначе изменчив.

Теперь все просто.
Если NumLock стабилен, ничего не делаем, просто посылаем команду %{DOWN}.
Если NumLock изменчивый, посылаем команду стабилизации (закрепления) {NUMLOCK}, и после уже спокойно пишем %{DOWN}, зная, что NumLock не изменится.

Конечно понятия "стабильный" и "изменчивый" надуманы но тут они отлично подходят.

Несколько фактов из наблюдений.
В стабильном состоянии следущие команды не меняют NumLock
%{DOWN}
{NUMLOCK} {NUMLOCK} (т.е. два раз подряд послать нажатие NumLock)

В изменчивом состоянии те же команды его меняют регулярно (при каждой команде NumLock 1 раз меняется) оставляя его изменчивым.
При этом команда
{NUMLOCK} (т.е. один раз послать нажатие NumLock)
работает так (допустим сейчас стабильное состояние, и он включен (лампочка горит)):
1. {NUMLOCK} - NumLock изменился (погас), состояние стало изменчивым
2. {NUMLOCK} - NumLock не изменился (не горит), состояние стало стабильным
3. {NUMLOCK} - NumLock изменился (загорелся), состояние стало изменчивым
4. {NUMLOCK} - NumLock не изменился (горит), состояние стало стабильным
...... и далее по кругу


Еще немного мелочей.
Во многих гайдах пишут подключить библиотеку для работы GetKeyboardState keystat(0), а именно:
Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
PtrSafe - там отсутствует, что вызывает ошибку, т.к. сейчас почти у всех Windows 64 bit, а не 32. Для совместимости и надо добавить.

Так же в этом объявлении для совместимости с 64-битной версией, рекомендуют использовать тип LongLong вместо Long. Возможно это где-то оправдано. У меня работали оба варианта, но у одного из тех, кому я делал вылезла ошибка, что у него нет такого типа данных (LongLong). По этому пишу просо Long.
Что у меня, что у него Windows 7 64bit, Excel 2010.

Вот еще из MSDN, из пояснений к функции GetKeyState (так и не понял, зачем использовать GetKeyboardState, если мы хотим узнать только одну кнопку), какие она возвращает состояния (она возвращает Integer):
0 if the key is neither down nor toggled,
-127 if the key is down but not toggled,
1 if the key is toggled but up, and
-128 if the key is both toggled and down.
где toggled - это якобы когда лампочка горит.
GetKeyboardState возвращает 129 вместо -127, 128 вместо -128
Соответственно, можно плясать от этих значений сразу, не пользуя UDF?

А вот то, что SendKeys "{NumLock}" не переключает сразу состояние, а бегает по этому кругу
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38914599
2994
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
interskА вот то, что SendKeys "{NumLock}" не переключает сразу состояние, а бегает по этому кругу
Не подходит, просто, SendKeys для этой задачи.
Тоже самое относится к CapsLock и ScrollLock - https://support.microsoft.com/ru-ru/kb/179987
MS предлагает использовать API в таких случаях - https://support.microsoft.com/ru-ru/kb/177674/en-us
To toggle the NUM LOCK, CAPS LOCK, or SCROLL LOCK keys, you can use the following logic:
1.Use the GetKeyboardState function to determine the state of the key.
2.Determine which operating system is being used with the GetVersionEx API. (Windows 95/98/Me and Windows NT/2000 require different methods for toggling these keys.)
3.Under Windows 95, Windows 98, or Windows Me, use the SetKeyboardState API function to set the state of the key. Under Windows NT or Windows 2000, use the keybd_event function to simulate a key press.
Код: vbnet
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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
' Declare Type for API call:
      Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128   '  Maintenance string for PSS usage
      End Type

      ' API declarations:

      Private Declare Function GetVersionEx Lib "kernel32" _
         Alias "GetVersionExA" _
         (lpVersionInformation As OSVERSIONINFO) As Long

      Private Declare Sub keybd_event Lib "user32" _
         (ByVal bVk As Byte, _
          ByVal bScan As Byte, _
          ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

      Private Declare Function GetKeyboardState Lib "user32" _
         (pbKeyState As Byte) As Long

      Private Declare Function SetKeyboardState Lib "user32" _
         (lppbKeyState As Byte) As Long

      ' Constant declarations:
      Const VK_NUMLOCK = &H90
      Const VK_SCROLL = &H91
      Const VK_CAPITAL = &H14
      Const KEYEVENTF_EXTENDEDKEY = &H1
      Const KEYEVENTF_KEYUP = &H2
      Const VER_PLATFORM_WIN32_NT = 2
      Const VER_PLATFORM_WIN32_WINDOWS = 1
    
    
    Sub Command1_Click()
      Dim o As OSVERSIONINFO
      Dim NumLockState As Boolean
      Dim ScrollLockState As Boolean
      Dim CapsLockState As Boolean

      o.dwOSVersionInfoSize = Len(o)
      GetVersionEx o
      Dim keys(0 To 255) As Byte
      GetKeyboardState keys(0)

      ' NumLock handling:
      NumLockState = keys(VK_NUMLOCK)
      If NumLockState <> True Then    'Turn numlock on
        If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=== Win95/98

          keys(VK_NUMLOCK) = 1
          SetKeyboardState keys(0)
        ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=== WinNT
        'Simulate Key Press
          keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
          keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _
             Or KEYEVENTF_KEYUP, 0
        End If
      End If

      ' CapsLock handling:
      CapsLockState = keys(VK_CAPITAL)
      If CapsLockState <> True Then    'Turn capslock on
        If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=== Win95/98
          keys(VK_CAPITAL) = 1
          SetKeyboardState keys(0)
        ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=== WinNT
        'Simulate Key Press
          keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
          keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY _
             Or KEYEVENTF_KEYUP, 0
        End If
      End If

      ' ScrollLock handling:
      ScrollLockState = keys(VK_SCROLL)
      If ScrollLockState <> True Then    'Turn Scroll lock on
        If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=== Win95/98
          keys(VK_SCROLL) = 1
          SetKeyboardState keys(0)
        ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=== WinNT
        'Simulate Key Press
          keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
          keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY _
            Or KEYEVENTF_KEYUP, 0
        End If
      End If
    End Sub

...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38914702
vmag_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
intersk,

А вот то, что SendKeys "{NumLock}" не переключает сразу состояние, а бегает по этому кругу

Не пойму, что куда бегает по кругу, приведите пожалуйста пример в какой конфигурации это не работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Option Compare Database
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Dim WsNumlock As Variant

Private Sub Form_Open(Cancel As Integer)
If GetKeyState(vbKeyNumlock) = 0 Then
Set WsNumlock = CreateObject("WScript.Shell")
WsNumlock.SendKeys "{NUMLOCK}"
End If
End Sub



Я уже даже себе эту фичу вставил в коммерческое приложение...
- во первых нужно выбросить весь ваш старый код (до последнего символа) ибо он действительно у компа делает мозги
на бикрень и после него уже вообще ничего стабильно не работает...
- то что вы этот код переделали под себя и теперь он не работает стабильно - это уже ваши проблемы...
- я то предполагал, что этот код есть единожды в событии открытия главной формы и больше нигде и никогда,
ибо он тупо определяет нужна приложению спец клавиатура с права или нет...
Прошу вас взять мой пример и потестировать его в неизменном виде на ещё не убитом вами компе, если именно
в этом примере на новом компе проявится нестабильность - опишите эту ситуацию, лично опробовал на всех компах
что в поле зрения (от ХР 32 до W8 64 под офис 2003 или его рантайм) - ни одного признака нестабильности:
- если не включен, включится
- если включен, не выключается
У кого ещё и в каких случаях была нестабильность ?
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38915629
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag_, продолжу тестирование (может и правда с компом что-то). У вас код на открытие формы, а я из него сделал функцию (разве это меняет работу кода?) и вешаю эту функцию на запуск Access и на Activate форм (на включение сделал, так как numlock гуляет - может выключиться из включенного состояния и чтобы при переходе к этой форме numlock включался)
...
Рейтинг: 0 / 0
Включение NumLock при открытии формы
    #38915671
intersk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag_, сделал на открытие формы, загружаемой при запуске базы - numlock может не включиться иногда ( Закономерность не выявлена
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Включение NumLock при открытии формы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]