Блокировать Методами Лотуса Комбинацию Ctrl + V

StarikStarik2705

Well-Known Member
08.02.2012
103
0
#1
есть код который симулирует нажатие клавиши любой, с помощью библиотеки виндовса user32.dll, но это лишь симуляция нажать/отжать, есть у котого идеи как при помощи методов лотуса перехватить нажатие клавиши? не собития ждать OnKeyPress гдето в представлении а именно методами библиотек Win API/ Сталкивался ли кто с такой задачей? я что хочу сделать, заблокировать комбинацию клавишь "вставить" ctrl + v, есть у меня код, мужик утверждает который написал его что мол всё чики пуки работает, вот пример, я его в клас запихнул но там куча на что ругаеться компилятор а где это взять не знаю даже.

option Explicit

'Implements KeyboardHook

Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" (ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pDest As Any, _
pSource As Any, _
ByVal cb As Long)

Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer

Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long



Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
Time As Long
dwExtraInfo As Long
End Type

' Low-Level Keyboard Constants
Private Const HC_ACTION = 0
Private Const LLKHF_EXTENDED = &H1
Private Const LLKHF_INJECTED = &H10
Private Const LLKHF_ALTDOWN = &H20
Private Const LLKHF_UP = &H80

' Virtual Keys
Public Const VK_TAB = &H9
public Const VK_CONTROL = &H11
Public Const VK_ESCAPE = &H1B
Public Const VK_DELETE = &H2E
Private Const WH_KEYBOARD_LL = 13&
Public KeyboardHandle As Long
Public KeyboardHook As KeyboardHook



Public Class AB

Sub Initialize

End Sub




Private Sub Form_Load()
Set KeyboardHandler.KeyboardHook = Me
HookKeyboard
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnhookKeyboard
End Sub


Private Function KeyboardHook_BlockAltEscape() As Boolean

End Function

Private Function KeyboardHook_BlockAltTab() As Boolean

End Function

Private Function KeyboardHook_BlockControlEscape() As Boolean
KeyboardHook_BlockControlEscape = True
End Function


' Implement this function to block as many key combinations as
' you'd like
Public Function IsHooked(Hookstruct As KBDLLHOOKSTRUCT) As Boolean

If (KeyboardHook Is Nothing) Then
IsHooked = False
Exit Function
End If

If (Hookstruct.vkCode = VK_ESCAPE) And _
CBool(GetAsyncKeyState(VK_CONTROL) _
And &H8000) Then

IsHooked = KeyboardHook.BlockControlEscape

Call HookedState(IsHooked, "Ctrl + Esc blocked")
Exit Function
End If

If (Hookstruct.vkCode = VK_TAB) And _
CBool(Hookstruct.flags And _
LLKHF_ALTDOWN) Then

IsHooked = KeyboardHook.BlockAltTab

Call HookedState(IsHooked, "Alt + Tab blocked")
Exit Function
End If


If (Hookstruct.vkCode = VK_ESCAPE) And _
CBool(Hookstruct.flags And _
LLKHF_ALTDOWN) Then

IsHooked = KeyboardHook.BlockAltEscape

Call HookedState(IsHooked, "Alt + Escape blocked")
Exit Function
End If

End Function

Private Sub HookedState(ByVal Hooked As Boolean, _
ByVal Text As String)
If (Hooked) Then Print Text
End Sub


Public Function KeyboardCallback(ByVal Code As Long,ByVal wParam As Long, ByVal lParam As Long) As Long

Dim Hookstruct As KBDLLHOOKSTRUCT

If (Code = HC_ACTION) Then
' Copy the keyboard data out of the lParam (which is a pointer)
Call CopyMemory(Hookstruct, ByVal lParam, Len(Hookstruct))

If (IsHooked(Hookstruct)) Then
KeyboardCallback = 1
Exit Function
End If

End If

KeyboardCallback = CallNextHookEx(KeyboardHandle, _
Code, wParam, lParam)

End Function

Public Sub HookKeyboard()
KeyboardHandle = SetWindowsHookEx( WH_KEYBOARD_LL,KeyboardCallback, App.hInstance, 0&)

Call CheckHooked
End Sub

Public Sub CheckHooked()
If (Hooked) Then
Print "Keyboard hooked"
Else
Print "Keyboard hook failed: " & Err.LastDllError
End If
End Sub

Private Function Hooked()
Hooked = KeyboardHandle <> 0
End Function

Public Sub UnhookKeyboard()
If (Hooked) Then
Call UnhookWindowsHookEx(KeyboardHandle)
End If
End Sub

' KeyboardHook.cls
Public Function BlockControlEscape() As Boolean

End Function

Public Function BlockAltEscape() As Boolean

End Function

Public Function BlockAltTab() As Boolean

End Function

End Class
 

Kizarek86

Well-Known Member
Lotus team
20.07.2007
863
6
#2
Чем не угодил "ctrl+v", если нужно запретить вставлять данные в представление это делается элементарно обработкой событий.
Если вставка данных в поле на форме то можно и без горячих клавиш обойтись.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#3
Что-то у меня ощущение, что чего-то не додали к коду...
KeyboardHook это тип KeyboardHook Оо..
да и еще вот эта строчка Set KeyboardHandler.KeyboardHook = Me, с этой не вяжется Public KeyboardHandle As long
Даже если предположить, что KeyboardHook это KBDLLHOOKSTRUCT, то все равно ошибки будут.
kizarek прав, в представлении это просто сделать.
А в форме-то зачем?
 

StarikStarik2705

Well-Known Member
08.02.2012
103
0
#4
Что-то у меня ощущение, что чего-то не додали к коду...
KeyboardHook это тип KeyboardHook Оо..
да и еще вот эта строчка Set KeyboardHandler.KeyboardHook = Me, с этой не вяжется Public KeyboardHandle As long
Даже если предположить, что KeyboardHook это KBDLLHOOKSTRUCT, то все равно ошибки будут.
kizarek прав, в представлении это просто сделать.
А в форме-то зачем?
изначально хотел сделать свою гарячую клавишу что бы вызвать окно диалоговое и что то там внести. Типа как ctrl + o открывает базу. А потом решил разобраться как перехватывать вообще клавиши с клавиатуры, и потом создать свою комбинацию по нажатию на которую был бы запущен мой код. Я видел гдето год назад как это было реализовано но слил этот код в унитаз и забыл где это. А сейчас выросла задача блокировать cntrl + v для любого действия, будь то что будет, представление или форма, я знаю как сделать это попроще для полей и для представления, есть и события и свойства, вплоть до снятия галочки одной в ACL базы, но!....это не так интересно)
Насчёт кода я сам понимаю что написана местами там вообще параша какая то непонятная
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#6
Где-то в книгах было, что вроде к имени агента добавляешь имя клавиши через подчёркивание, то тогда он срабатывает по комбинации клавиш. Сам не пробовал.
 

StarikStarik2705

Well-Known Member
08.02.2012
103
0
#7
Где-то в книгах было, что вроде к имени агента добавляешь имя клавиши через подчёркивание, то тогда он срабатывает по комбинации клавиш. Сам не пробовал.
попробую

Добавлено:
угу... А потом один пользователь на Mac OS и приплыли, но раз интересно.
Вот тут есть, но язык C++, http://pastebin.com/KFVzfJLq
По идее то что надо, только необходимо перевести на LS.
у меня всё упираеться в то что в примерах VBA они ссылаються на какието переменные которые не обьявлены, и которых нет в библиотеке user32, поетому лажаю, логика обработки понятна, но вот сама идея нажал кнопку и получи событие не очень, у меня в голове так сложилось что получаеться есть служба которая постоянно мониторит клавиши на не нажали кто чего, и даёт результат, вот я хочу с ней поработать.
этот код по идее обрабатывает что нажато:
Function KeyboardProc(Byval idHook As Long, Byval wParam As Long, Byval lParam As Long) As Long
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, Byval lParam)
Else
'check if SHIFT-S is pressed
If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
'show the result
Print "Shift-S pressed ..."
End If
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, Byval lParam)
End If
End Function
ну а эта строка по идее из примеров должна всё делать:
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
но, лотус говорит мне - дорогой! если hHook я ещё понимаю что то что такое App.hInstance? и плюёт что ошибка компиляции, и оно понятно, что за обьект никто не знает.
AddressOf KeyboardProc - я так понял сюда подставляеться моя функция, но что за Арр я не знаю, и толком на форумах не нашёл ничего
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#8
Ну вот как-то так:
Type: HINSTANCE
A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/wi...lling_releasing
C++:
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL; 
static HHOOK hhookSysMsg; 

hinstDLL = LoadLibrary(TEXT("c:\\myapp\\sysmsg.dll")); 
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc"); 

hhookSysMsg = SetWindowsHookEx( 
WH_SYSMSGFILTER,
hkprcSysMsg,
hinstDLL,
0);
 

StarikStarik2705

Well-Known Member
08.02.2012
103
0
#9
Ну вот как-то так:

http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/wi...lling_releasing
C++:
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL; 
static HHOOK hhookSysMsg; 

hinstDLL = LoadLibrary(TEXT("c:\\myapp\\sysmsg.dll")); 
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc"); 

hhookSysMsg = SetWindowsHookEx( 
WH_SYSMSGFILTER,
hkprcSysMsg,
hinstDLL,
0);
даже не знаю как это к лотусу прикрутить) я был на этих сайтах механизм понятен, как это написать нет


Добавлено:
Где-то в книгах было, что вроде к имени агента добавляешь имя клавиши через подчёркивание, то тогда он срабатывает по комбинации клавиш. Сам не пробовал.
а есть пример название агента?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#10
CтарыйStarik
Я про то что HINSTANCE это хэндл библиотеки, где прописана процедура перехвата, CallBack так сказать.
в SetWindowsHookEx передаются:
фильтры нажатия клавиш;
имя процедуры, которая обрабатывает;
хэндл библиотеки где искать процедуру;
ну и 0 / NULL, как завелось в WinApi

Так что без дополнительного кодинга не получится.
 

StarikStarik2705

Well-Known Member
08.02.2012
103
0
#11
CтарыйStarik
Я про то что HINSTANCE это хэндл библиотеки, где прописана процедура перехвата, CallBack так сказать.
в SetWindowsHookEx передаются:
фильтры нажатия клавиш;
имя процедуры, которая обрабатывает;
хэндл библиотеки где искать процедуру;
ну и 0 / NULL, как завелось в WinApi

Так что без дополнительного кодинга не получится.
понятно надо пробовать) благодарю, может что и на кодирую
 

Мыш

Well-Known Member
Lotus team
12.02.2008
1 085
13
#12
Неблагодарное это дело... Проще, ИМХО, написать DLL и ее вызывать из Лотуса...
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#14
Мыш, так и придется.
CтарыйStarik
во второй моей ссылке на MSDN есть пример "Using Hooks", нужен кусок кода: WH_KEYBOARD hook procedure
Не знаю проканает или нет решение в лоб, но можно попробовать вставить этот код в проект Visual Studio, да скомпилить DLL.
строка #include "app.h" по идее не нужна, так как это просто кусок кода из проекта программы, которая показывает системные сообщения ее работы.