Что нового

Правильно ли работает функция _ClipBoard_GetOwner() ?

beve

Осваивающий
Сообщения
104
Репутация
31
OS Windows 7.
Мне нужно узнать какая программа поместила текст в буфер обмена. Сначала можно узнать хендл-дескриптор окна этой программы. Нашел данную функцию в справке, она должна указать дескриптор окна из которого был помещен текст в буфер обмена, но не работает.
Для примера нужно вставить скрипт, что ниже, в SciTE и скопировать фрагмент текста из него. Потом запустить скрипт на выполнениие, в результате оказывается, что хендл окна с которого был скопирован текст в буфер (а это SciTE), не совпадает с хендлом самого SciTE. Что я не понимаю?
Код:
#include <GuiConstantsEx.au3>
#include <ClipBoard.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $iMemo
Global $Handle= WinGetHandle("[ACTIVE]")
_Main()

Func _Main()
	Local $hGUI

	; Создаёт GUI
	$hGUI = GUICreate("Clipboard", 600, 400)
	$iMemo = GUICtrlCreateEdit("", 2, 2, 596, 396, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUISetState()
	; Открывает буфер обмена
	If Not _ClipBoard_Open ($hGUI) Then _WinAPI_ShowError ("_ClipBoard_Open failed")
	ShowData($hGUI)
	; Закрывает буфер обмена
	_ClipBoard_Close ()
	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Main

; Показывает статистику буфера обмена
Func ShowData($hGUI)
	MemoWrite("Дескриптор окна (из которого текст был помещен в буфер) .......: " & _ClipBoard_GetOwner ())
	MemoWrite("Дескриптор окна SciTE (с которого был скопирован текст в буфер) ..: " & $Handle)
	MemoWrite()
	MemoWrite("Текст в буфере ..: " & ClipGet())
	MemoWrite()
EndFunc   ;==>ShowData

; Записывает строку в элемент для заметок
Func MemoWrite($sMessage = "")
	GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
да вроде все правильно. или я не там смотрю?
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
31
Спасибо за ответ. Это я не правильно понял описание этой функции из справки.

Но у меня проблема не решилась. Суть такова: вот есть файл, для понятия проблемы нужно запустить этот файл, напечатать что-то в элементе TfsSyntaxMemo (в самом большом поле), дальше запустить скрипт:
Код:
#include <ClipBoard.au3>
MsgBox(64,"Message", "Владелец буфера .......: " & _ClipBoard_GetOwner() & @CRLF & "Дескриптор окна (из которого текст был помещен в буфер) .......: " & ControlGetHandle("Редактор скриптов AVZ", "", "[CLASS:TfsSyntaxMemo; INSTANCE:1]" ))

В результате "владельцем" буфера должен быть хенл элемента TfsSyntaxMemo, но как видите оба хендла разные. Скажите, каким образом можно получить такой хендл элемента из этой программы, который получает функция _ClipBoard_GetOwner(). Пересмотрел все возможные элементы в программе и их хендлы, но нету 100 % совпадения с _ClipBoard_GetOwner(). Очень прошу помощи.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
дескрипторы и будут разные. потому что в редакторе скриптов от AVZ в буфер обмена данные посылает не само TfsSyntaxMemo, а дочернее окно.
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
31
Просмотрел все хендлы в этом "дочернем окне", совпадений не нашел. Это ваша догадка? А если копировать текст по CTRL+C то причем будет это дочернее окно?

Случайно нашел, что функция
Код:
$sTitle=WinGetTitle(_ClipBoard_GetOwner(), '')
в данном случае возвращает правильный заголовок окна этой программы. Этого мне хватит.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
beve [?]
Это ваша догадка?
почти. :smile: по другому ведь не может быть. откуда то берется второй дескриптор.
но на самом деле два окна. окно программы и окно редактора в основном окне. вот хэндл окна редактора мы и получаем функцией
Код:
_ClipBoard_GetOwner()
. и Window Info его не видит. ни хэндл окна, ни класс.
есть функция. которая получает хэндл этого окна
http://autoit-script.ru/index.php?topic=229.0
на скрине вторая запись в массиве это и есть хэндл окна, которое и является владельцем буфера обмена, когда мы копируем из основного окна редактора
скриптов.
ну и там же мы видим класс окна. так что . в принципе, твоя задача решена без получения заголовка окна . как ты и хотел
или я ошибаюсь?
 
Верх