Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 14:43   #1
PowerUSB
 
Регистрация: 28.11.2013
Сообщений: 5
По умолчанию Хук для буфера обмена

Добрый день)
Нуждаюсь в помощи от участников этого форума.
Сам я php программист, но тут появилась задача написать програмку на VBA. Один из моментов, который я никак не могу сообразить, это сделать следующее: Следить за буфером, если в него скопировано новое значение, то получить это значение и выполнить действие(тип данных только string в буфере интересует). В инете перечитал кучу форумов (и этот кстати тоже, тут есть подобная тема но всеравно ничего не понятно). Помогите реализовать данную задачу=)))
MS Access 2013.
PowerUSB вне форума Ответить с цитированием
Старый 29.11.2013, 21:47   #2
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

А как бы вы делали в пхп? Напишите алгоритмически. Поищем аналогии
Андрэич вне форума Ответить с цитированием
Старый 29.11.2013, 22:28   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...написал под vbs:
Код:
Set clp = CreateObject("htmlfile")  
txt = clp.ParentWindow.ClipboardData.GetData("text")  

Do
 txt2 = clp.ParentWindow.ClipboardData.GetData("text")  
 If txt <> txt2 Then MsgBox txt2
 txt = txt2
Loop
а вы уж адаптируйте под VBA.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.11.2013, 22:32   #4
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Код:
'В общий модуль:
Option Compare Database
Option Explicit

Public Const CF_TEXT = 1
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)
-----------------------------------------------------------------------
Sub test()
    Dim hStrPtr As Long, lLength As Long, sBuffer As String
    OpenClipboard Application.hWndAccessApp
    hStrPtr = GetClipboardData(CF_TEXT)
    If hStrPtr <> 0 Then
        lLength = lstrlen(hStrPtr)
        If lLength > 0 Then
            sBuffer = Space$(lLength)
            CopyMemory ByVal sBuffer, ByVal hStrPtr, lLength
                MsgBox sBuffer, vbInformation
        End If
    End If
    CloseClipboard
End Sub
???
Андрэич вне форума Ответить с цитированием
Старый 30.11.2013, 20:36   #5
PowerUSB
 
Регистрация: 28.11.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Андрэич Посмотреть сообщение
Код:
'В общий модуль:
Option Compare Database
Option Explicit

Public Const CF_TEXT = 1
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)
-----------------------------------------------------------------------
Sub test()
    Dim hStrPtr As Long, lLength As Long, sBuffer As String
    OpenClipboard Application.hWndAccessApp
    hStrPtr = GetClipboardData(CF_TEXT)
    If hStrPtr <> 0 Then
        lLength = lstrlen(hStrPtr)
        If lLength > 0 Then
            sBuffer = Space$(lLength)
            CopyMemory ByVal sBuffer, ByVal hStrPtr, lLength
                MsgBox sBuffer, vbInformation
        End If
    End If
    CloseClipboard
End Sub
???
А можно еще пояснить как это работает? Я так понял что мне функцию test нужно каждую секунду вызывать что бы следить за буфером*?
Просто это я делаю для решения следующей задачи, будет таблица, где будут записывать номера карт (Em-marine) это такие карты для управления доступом. Не хочу заморачиваться с SDK поэтому решил сделать через буфер. Человек прикладывает карту к считывателю, одна утилитка которая сидит в трее копирует номер карты в буфер. Этот момент мне надо поймать и из буфера записать номер карты в базу. как то так=))

Последний раз редактировалось PowerUSB; 30.11.2013 в 20:54.
PowerUSB вне форума Ответить с цитированием
Старый 02.12.2013, 06:05   #6
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Да, наверное. По таймеру (событие формы Таймер + свойство Интервал таймера) вызывать эту процедуру, изменив её на (процедуру-)функцию: Function
Андрэич вне форума Ответить с цитированием
Старый 01.04.2014, 23:43   #7
PowerUSB
 
Регистрация: 28.11.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Андрэич Посмотреть сообщение
Да, наверное. По таймеру (событие формы Таймер + свойство Интервал таймера) вызывать эту процедуру, изменив её на (процедуру-)функцию: Function
Да, это то что надо. Спасибо. Отлично работает)
PowerUSB вне форума Ответить с цитированием
Старый 20.02.2016, 08:20   #8
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Цитата:
Сообщение от PowerUSB Посмотреть сообщение
Человек прикладывает карту к считывателю, одна утилитка которая сидит в трее копирует номер карты в буфер. Этот момент мне надо поймать и из буфера записать номер карты в базу. как то так=))
Умная мысля приходит опосля. Вдруг, кому сгодится, не рецепт, но хотя бы красота в простоте... Расхожий полезный Punto Switcher поможет: опция Следить за буфером (+ др настройки). А оттуда уже можно выудить что хочешь и когда хочешь...
Андрэич вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
очистка буфера обмена beegl Общие вопросы Delphi 21 04.01.2017 11:01
Hook буфера обмена rust-02 Общие вопросы Delphi 0 20.09.2010 19:21
Вставка из буфера обмена volonc Microsoft Office Excel 12 17.07.2010 19:04
Контроль буфера обмена AndrzejX Общие вопросы Delphi 8 20.02.2009 07:30