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

Тема в разделе "Lotus - Программирование", создана пользователем StarikStarik2705, 8 июл 2013.

  1. StarikStarik2705

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    есть код который симулирует нажатие клавиши любой, с помощью библиотеки виндовса 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
     
  2. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Чем не угодил "ctrl+v", если нужно запретить вставлять данные в представление это делается элементарно обработкой событий.
    Если вставка данных в поле на форме то можно и без горячих клавиш обойтись.
     
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Что-то у меня ощущение, что чего-то не додали к коду...
    KeyboardHook это тип KeyboardHook Оо..
    да и еще вот эта строчка Set KeyboardHandler.KeyboardHook = Me, с этой не вяжется Public KeyboardHandle As long
    Даже если предположить, что KeyboardHook это KBDLLHOOKSTRUCT, то все равно ошибки будут.
    kizarek прав, в представлении это просто сделать.
    А в форме-то зачем?
     
  4. StarikStarik2705

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    изначально хотел сделать свою гарячую клавишу что бы вызвать окно диалоговое и что то там внести. Типа как ctrl + o открывает базу. А потом решил разобраться как перехватывать вообще клавиши с клавиатуры, и потом создать свою комбинацию по нажатию на которую был бы запущен мой код. Я видел гдето год назад как это было реализовано но слил этот код в унитаз и забыл где это. А сейчас выросла задача блокировать cntrl + v для любого действия, будь то что будет, представление или форма, я знаю как сделать это попроще для полей и для представления, есть и события и свойства, вплоть до снятия галочки одной в ACL базы, но!....это не так интересно)
    Насчёт кода я сам понимаю что написана местами там вообще параша какая то непонятная
     
  5. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    угу... А потом один пользователь на Mac OS и приплыли, но раз интересно.
    Вот тут есть, но язык C++, http://pastebin.com/KFVzfJLq
    По идее то что надо, только необходимо перевести на LS.
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Где-то в книгах было, что вроде к имени агента добавляешь имя клавиши через подчёркивание, то тогда он срабатывает по комбинации клавиш. Сам не пробовал.
     
  7. StarikStarik2705

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    попробую

    Добавлено:
    у меня всё упираеться в то что в примерах 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 - я так понял сюда подставляеться моя функция, но что за Арр я не знаю, и толком на форумах не нашёл ничего
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Ну вот как-то так:
    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);
     
  9. StarikStarik2705

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    даже не знаю как это к лотусу прикрутить) я был на этих сайтах механизм понятен, как это написать нет


    Добавлено:
    а есть пример название агента?
     
  10. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    CтарыйStarik
    Я про то что HINSTANCE это хэндл библиотеки, где прописана процедура перехвата, CallBack так сказать.
    в SetWindowsHookEx передаются:
    фильтры нажатия клавиш;
    имя процедуры, которая обрабатывает;
    хэндл библиотеки где искать процедуру;
    ну и 0 / NULL, как завелось в WinApi

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

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    понятно надо пробовать) благодарю, может что и на кодирую
     
  12. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.021
    Симпатии:
    8
    Неблагодарное это дело... Проще, ИМХО, написать DLL и ее вызывать из Лотуса...
     
  13. StarikStarik2705

    StarikStarik2705 Well-Known Member

    Регистрация:
    8 фев 2012
    Сообщения:
    103
    Симпатии:
    0
    если бы умел так и сделал бы)
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Мыш, так и придется.
    CтарыйStarik
    во второй моей ссылке на MSDN есть пример "Using Hooks", нужен кусок кода: WH_KEYBOARD hook procedure
    Не знаю проканает или нет решение в лоб, но можно попробовать вставить этот код в проект Visual Studio, да скомпилить DLL.
    строка #include "app.h" по идее не нужна, так как это просто кусок кода из проекта программы, которая показывает системные сообщения ее работы.
     
Загрузка...
Похожие Темы - Блокировать Методами Лотуса
  1. slavon-x86
    Ответов:
    2
    Просмотров:
    2.078
  2. alb
    Ответов:
    1
    Просмотров:
    3.236

Поделиться этой страницей