Private Declare Function SetCursorPos _
Lib "user32.dll" ( _
ByVal X As Long, _
ByVal Y As Long) As Long
Private WithEvents wdApp As Word.Application
Private Sub Document_Open()
Set wdApp = Application
End Sub
Private Sub wdApp_WindowSelectionChange(ByVal Sel As Selection)
Dim cX As Long, cY As Long
wdApp.ActiveWindow.GetPoint cX, cY, 0&, 0&, Sel.Range
SetCursorPos cX, cY
End Sub
Всплывающая подсказка для сноски в Word 2013 без мышиного указателя
При выполнении команд "следующая сноска" или "предыдущая сноска" курсор становится между сноской и словом, к которому она привязана.
Как сделать (какой макрокомандой или другим способом), чтобы подсказка появлялась после перескока к сноске без участия мыши?
Возможно, к этой теме относится вот это:
https://msdn.microsoft.com/ru-ru/library/system.wi...(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
***********************************
Там про это:
Свойство Cursor.HotSpot
.NET Framework (current version)
Возвращает активную точку курсора.
Пространство имен: System.Windows.Forms
Сборка: System.Windows.Forms (в System.Windows.Forms.dll)
Синтаксис VB
Public ReadOnly Property HotSpot As Point
Значение свойства
Type: System.Drawing.Point
Объект Point, представляющий активную точку курсора.
HotSpot — Point В курсор, который взаимодействует с другими элементами на экране.
**********************************
То есть, по моим понятиям надо после скачка к сноске в точку расположения курсора перевести указатель мыши (сфокусировать что ли?). Может быть, тогда подсказка и всплывет, если она не глупая?
Или это мистика?
Если переместить курсор с помощью WinAPI функции SetCursorPos, то подсказка появляется.
Я очень извиняюсь, но мне нужен подробный текст макрокоманды (лучше с комментариями), который я бы сумел вставить в шаблон normal.dotm.
Сам я такой макрос не сочиню ни за что в жизни.
2) После копирования, необходимо выполнить событие Document_Open. В дальнейшем, в этом не будет необходимости, т.к. событие будет выполняться автоматически, сразу после открытия любого докумета. Если вникать в такие тонкости не хочется :) то после копирования/вставки кода и сохранения документа, можно просто перезапустить Word.
3) Пример актуален только для 32-bit. Если Вы являетесь обладателем 64-bit, то Вам необходимо изменить об'явление WinAPI функции SetCursorPos и тип переменных cX и cY. Сделать это поможет статья, опубликованная на официальном сайте Microsoft.
Совместимость 32- и 64-разрядных версий Office 2010 и файл Win32API_PtrSafe.txt, который можно скачать там же.
P.S.Доступа к 64-разрядной версии не имею, так что мучить меня в этом плане, не имеет смысла :)
Код:
У нас дома два компа: и 32-х, и 64-х разрядный. Я попробую сперва на другом, если разберусь.
Пугает, правда, что я не до конца понимаю суть Вашего решения и боюсь, что оно затронет других.
P.S. Если бы в теме был документ (не содержащий конфиденциальных данных) со сносками, было бы попроще.
Уважаемый, Pashulka!
ОТЛИЧНО!
Я все сделал, как Вы велели, и испытал в деле Ваши рекомендации (на 32-х разрядном Офисе).
Вашу функцию (или как правильно?) я вставил в шаблон NORMAL.DOTM.
При первом же запуске ВСЕ ЗАРАБОТАЛО (!), почти как надо.
Вот как получается.
Там же (кроме перемещения самого курсора стрелками) для сносок есть три основных команды, которые я и использую (горячими клавишами).
- Первая (ViewEndnoteArea) делает скачок от основного текста к тексту сносок и обратно.
- Две других (GoToNextEndnote и GoToPreviousEndnote) делают перескок и в тексте сносок вверх-вниз, и в основном тексте от сноски к сноске.
- При перемещении курсора стрелками по доку все идет отлично: курсор приходит к слову с курсором - подсказка всплывает и при прямом, и при заднем ходе, как дрессированная.
- При перескоке из текста сносок к сноске в основном тексте подсказка тоже всплывает очень хорошо.
- А вот при перескоке между сносками в основном тексте при помощи указанных команд (пред. сноска - след. сноска) подсказка уже не хочет всплывать. Наверное, как раз в этом месте - между словом и сноской - черная дыра; подсказка и не чувствует, где курсор скрылся. (Ну это не беда, - его можно подвинуть макросом туда-сюда на знак - и подсказка поймет, что пора всплывать.)
- Кроме того, стали всплывать и к примечаниям подсказки по той же схеме (что мне в принципе тоже на пользу), но после перехода хотя бы к одному примечанию, сноскины подсказки уже не всплывают (странно это).
Короче, почти то самое, что я хотел, но все-таки, НЕМНОЖКО НЕ ТО, и я доспрошу Вас.
Понимаю, что вопросы от человека, не понимающего в программировании, могут взбесить любого программиста, но мне надо все понять, как следует.
Что меня не устраивает?
Ваше решение теперь действует на все документы и постоянно.
А мне хочется, чтобы это было только в выбранных документах и после конкретных макрокоманд и только внутри этих макрокоманд.
Например, я подключаю к шаблону собственные вкладки так:
Разработчик/Шаблоны и надстройки/Добавить - и ставлю галочку на время сеанса (я даже в стартовый каталог их не гружу), чтобы потом отключились.
Вот мне и хочется, чтобы Ваша фишка тоже также работала. Значит, по моему разумению должен быть такой схемы макрос:
Sub СледующаяСноска()
Application.Run MacroName:="GoToNextEndnote" (это обычный макрос Word)
Здесь Ваша функция начинается
- Определяется, куда попал курсор после GoToNextEndnote, но подсказка на него не реагирует...
- Указатель мыши определяет, где находит курсор и - туда же прыгает (наверное)...
- Если надо, курсор влево-вправо шевельнется...
- Подсказка понимает, что делать нечего - пора наверх - и всплывает.
End Sub
Вся эта макрокоманда запускается горячей комбинацией
Уж не знаю, какая должна быть макрокоманда, не разбираюсь.
*************
И еще. Прочитал сейчас Ваш последний ответ.
Документ со сносками, примечаниями (чтобы, как говорится, было что в руках подержать) я Вам, конечно пришлю. И даже полный шаблон со всеми своими макросами. Увидите эти команды, поймете: там много интересного и необычного. Но команды все - штатные.
Но я вообще не выделяю сносок (зачем?), когда их перебираю: только горячей клавишей перескакиваю от одной к другой или от сноски к тексту сносок.
И поэтому мне вообще-то не надо, чтобы они засвечивались, когда я просто стрелками мимо них курсор веду: это их не касается; для них будет свой отдельный вызов, о котором мы и говорим.
Сейчас подготовлю текст.
Если Ваш код удалить из модуля ThisDocument, то все станет не прежнее место, как будто не было или еще надо что-то доудалять?
Код:
Private Declare Function SetCursorPos _
Lib "user32.dll" ( _
ByVal X As Long, _
ByVal Y As Long) As Long
Private Sub СледующаяСноска()
Application.Run "GoToNextEndnote"
Dim cX As Long, cY As Long
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Next(wdCharacter)
SetCursorPos cX, cY
End Sub
Lib "user32.dll" ( _
ByVal X As Long, _
ByVal Y As Long) As Long
Private Sub СледующаяСноска()
Application.Run "GoToNextEndnote"
Dim cX As Long, cY As Long
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Next(wdCharacter)
SetCursorPos cX, cY
End Sub
Application.Run "GoToNextEndnote"
Dim cX As Long, cY As Long
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Next(wdCharacter)
SetCursorPos cX, cY
End Sub
Это я так понял, усовершенствованный макрос.
А первую часть куда вставлять? В ней, наверное, какое-то объявление делается.
У меня все макросы тут лежат: Normal Modules NewMacros.
Пора спать...
Если перемещаться между сносками (#3), то подсказка не всплывает, причём неважно куда мы переместим курсор. Иначе говоря, даже если мы переместим курсор мышки на один символ вправо(влево), подсказка всё равно не появится. И причина подобного игнора Word - мне неизвестна. Более того, до вчерашнего дня я вообще не знал о таком безобразии.
Я же конкретно написал, что все всплывает!!!
Сейчас только еще раз проверил на 32-х разрядном. Нажимаю макрос "след." или "пред. сноска", курсор перемещается куда надо (между словом и сноской), я шевелю его вправо или влево, и подсказка как миленькая всплывает в обоих случаях. Осталось только внутрь макроса эти действия запихнуть.
Я сейчас изучаю различия 32-х и 64-х разрядов для Declare и PtrSafe. С трудом понимаю, о чем речь. Про этот оператор пойму, может, налажу и на 64-х разрядном.
Я спросил Вас, куда первую часть кода вставлять? В какое место модуля NewMacros?
Если б я в VB получше понимал, я бы Вашу подпрограмму на время работы со сносками подключал и меня бы это устраивало.
Сейчас не очень нравится, что сноски все время подскакивают. А второе: примечания на этот код глюк наводят - надо закрывать док и опять открывать.
Что бы сделать еще?
А вчера я этот последний код в шаблон 64-х разрядного офиса сунул, так верхняя половина с Declare почему-то в предыдущую макрокоманду залезла. Я ж в этом деле тупой. Мне пошагово надо подсказать.
Имелось ввиду - без дополнительных телодвижений. Иначе говоря, сразу после использования горячих клавиш, подсказка не появляется.
Что касается второго макроса, то SetCursorPos в начало модуля, а СледующаяСноска можно и в любое(допустимое)
Если выполните Set wdApp = Nothing , то курсор мышки перестанет перещаться к выделенному об'екту.
Теперь, пока не разберусь с отличиями в разрядности офиса, вся эта работа зависнет. А разбираться мне придется долго: дуб дубом.
Испробовал на обоих офисах Ваш код, причем для 64-х битового ничего так и не изменил.
В общем он работает, но не всегда.
Посылаю тот же документ, что прошлый раз - normal.dotm, в котором есть и пробный текст со сносками, и макрокоманды, и их горячие клавиши.
Прошу Вас посмотреть в большом масштабе 500%, куда становится указатель курсора после перехода по сноскам.
Видно, что каждый раз после перехода по сноске и вперед, и назад указатель мыши строго выполняет Ваше приказание, становясь на знак правее или левее (я и так, и так заставлял, даже на слово заставлял сдвигаться).
А подсказка всплывает иногда хорошо, а иногда не хочет. Иногда туда-сюда пройдусь, так она всплывает на свое усмотрение даже на одной и той же сноске.
Поэтому у меня появилась мысль, что одних координат указателя ей маловато. Другая мысль подсказывает, что вообще нет смысла указатель сдвигать на знак в сторону: пусть точно встает по найденным координатам.
В таблице (в документе) есть сноски около разного шрифта и символов. По этим сноскам видно, где указатель появляется.
При отказе подсказки от появления сначала казалось, что указатель слишком в стороне от сноски или слова установился, но потом оказалось не так.
Даже после легкого сдвига указателя мыши подсказка обязательно появляется. Причем сдвиг можно сделать и наружу, то есть, удаляясь от сноски или слова со сноской.
Чует мое сердце, что подсказке движение (шевеление) нужно в поле сноски. Поле это, по-видимому, охватывает некий прямоугольник со словом и сноской. А размер этого прямоугольника зависит, наверное, от размера шрифта, об базовой линии текста и пр..
Если можете, включите это движение (сдвиг) типа mouseover / out в поле слова со сноской после того, как указатель встанет по координатам курсора вместо вот этого: Selection.Next(wdCharacter).
И тогда все заработает надежно.
А вообще код классный: я много посмотрел на форумах - и коротко, и ясно.
С уважением, Auto-teacher!
Его надо открыть именно как шаблон из Wordа, а то может текст не появиться.
Непонятно зачем Вы обращаетесь ко мне лично. Ведь я уже подтвердил, что в Вашем шаблоне подсказки не появляются, если пользоваться горячими клавишами. В других случаях, проблем нет.
Еще я заметил, что если после SetCursorPos идет MsgBox, а потом закрывается, то подсказка всплывает всегда.
Спасибо за советы!!!
Подсказки стабильно всплывают при переходе и по гиперссылкам, и по сноскам во всех режимах просмотра.
Если не появится решения с применением событий мыши (наведение и пр.), можно тему закрыть.
Спасибо за помощь!