Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу правая клавиша мыши и Excel
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Яйцеголовый Яйцеголовый вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2005
По умолчанию правая клавиша мыши и Excel - 09.06.2005, 20:32

Есть ли способ управлять (изменять, запрещать, прятать)

появляющиеся при нажатии правой клавиши мыши меню в

Excel. Может Win32 API, но как?

Хотелось бы средствами Excel ->VBA ->Win32 API
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 09.06.2005, 21:43

Какие именно контекстные меню Вы хотите заблокировать .. Если меню, которое появляется при клике правой мышке в ячейке рабочего листа, то для этого достаточно разместить в модуле ThisWorkbook (ЭтаКнига) этот код :

Код:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
Cancel = True
End Sub
A в других случаях конечно будет немного сложнее, нужно знать имя CommandBars
Ответить с цитированием
  (#3 (permalink)) Старый
Яйцеголовый Яйцеголовый вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2005
По умолчанию 10.06.2005, 19:08

Спасибо за ответ.
Я действительно подразумевал различные контекстные меню открывающиеся при правом клике в различных областях окна Excel, т. к. Workbook_SheetBeforeRightClick отзывается только на клик на листе и на обозначении строк/столбцов.
Насчитал сейчас 10 видов меню при кликах на обычно используемых стандартных элементах (листе, панели меню, ярлыки листов, полосы прокрутки и т.п).
Узнать имена CommandBars не проблема:
CommandBars.Count
CommandBars.Item(i).Name
Но контекстные меню - это контекстные CommandBars ? Если да, то как воздействовать на эти меню. Может дескриптор (API) окна меню нужен? Но как к этому привязаться?
К тому же хотелось бы не только запрещать вызов, но и менять элементы в меню.
Все это нужно против:
- «шаловливых рученок»
-закрыть доступ
-улучшить работу.
Ответить с цитированием
  (#4 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 10.06.2005, 20:50

Контекстные меню CommandBarPopup действительно являются частью семейства CommandBars, а следовательно с ними можно производить те же манипуляции, что и с обычными панелями инструментов.

Код:
Private Sub Auto_Open()

With Application.CommandBars("Ply")
    With .Controls.Add(Type:=msoControlButton, Before:=4) ' Temporary:=True
        .Caption = "Удалить лист"
        .OnAction = "Virus"
    End With
    .Controls(3).Enabled = False
    '.Controls("&Удалить").Enabled = False
End With

End Sub

Private Sub Auto_Close()

Application.CommandBars("Ply").Reset

End Sub

Private Sub Virus()

MsgBox "А вот и нет", , ""

End Sub
Примечание :
- Естественно, что вышеопубликованный код не является полным, тем более, что существует ещё одна команда Удалить лист, которая расположена в меню Правка. Так что это только фундамент для Ваших будущих издевательств над MS Excel.
- Вы вправе использовать другие события рабочей книги, например Workbook_Open(), Workbook_Activate()
- Вы также можете использовать передачу аргументов по позиции, а не по имени.
Ответить с цитированием
  (#5 (permalink)) Старый
Яйцеголовый Яйцеголовый вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2005
По умолчанию 14.06.2005, 20:21

Спасибо большое pashulka за помощь.
Взял паyзу и с Вашими последними советами поиздевался над Excel.
Но чем больше узнаешь, тем больше вопросов.
Почти все Controls, которые хотел закрыть, закрыл. Не вызываются никакие меню при нажатии правой клавиши мыши в любой области рабочей книги кроме 3-х. Остались меню, которые открываются при правом клике в области линеек прокрутки (1-й тип) и на линии верхней части окна (2-й тип, сейчас не подберу слово, как назвать, у меня синяя полоса с именем книги), где на значке Excel еще и по левому клику тоже открывается меню. До 2-го типа я кажется добрался, и имя его "System" и в нем Controls по именам сравнил, но Enabled=False не приводит к отключению меню как на всех остальных. А 1-го типа меню (все таки их два разных) вообще не нашел по названию Controls. Именно по названию Controls я добирался до конкретного меню.
Set All_Controls = Application.CommandBars.FindControls
i_Controls = All_Controls.Count
Set i_Control = All_Controls.Item(i)
Set i_Parent = i_Control.Parent
Все названия и изменения свойств делал через окно Locals Window в окне VB Excel. К стати этот путь мне «открылся» случайно, но там столько интересного!!! Особенно если:
Set All = Application
то гуляя по All, как я понимаю, гуляем по «миру» нашего Excel с описанием свойств, значений, состояний и т.п.???
Может это все не профессионально, но на выше заданные вопросы хотелось бы услышать ответы. И побороть эти 3 меню (может вовсе и не CommandBar… они?).
И еще вопрос:
Цитата: - Вы также можете использовать передачу аргументов по позиции, а не по имени.
О чем речь? (я же чайник или лень думать). Пожалуйста, примеры с намеком.
Заранее спасибо!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 15.06.2005, 00:28

1. Насколько я помню в MS Excel нет термина "линейка прокрутки" … а что касается полос прокрутки, то при клике правой кнопкой мышки никаких контекстных меню не появляется. Возможно это тот случай, когда один скриншот стоит тысячи слов.

2. Подобный результат : Microsoft Excel - Имя_рабочей_книги можно получить только, если окно рабочей книги развёрнуто во весь экран так как на самом деле системное меню "System" "принадлежит" именно строке заголовка приложения, а не строке заголовка рабочей книги. И это очень важно, потому что удалить системное меню рабочей книги, которое представлено в виде листа xls можно очень легко, например :

Код:
ThisWorkbook.Protect Windows:=True
' Передача аргумента по имени

ThisWorkbook.Protect , , True
 Передача аргумента по позиции
А для удаления системного меню приложения необходимо использовать функции WinAPI

Код:
'/
'/Disabling the Windows Control Menu: 32-bit
'/
'/The code below can be used in Excel 97 to disable
'/the Windows control menu - this will prevent a user
'/from using the control menu to either close or minimize
'/the Excel application window.  Note that the declare
'/statements must be placed at the top of the VBA module.

Declare Function FindWindowA Lib "USER32" ( _
    ByVal lpClassName As Any, _
    ByVal lpWindowName As Any) As Long
Declare Function GetWindowLongA Lib "USER32" ( _
    ByVal hWnd As Integer, _
    ByVal nIndex As Integer) As Long
Declare Function SetWindowLongA Lib "USER32" ( _
    ByVal hWnd As Integer, _
    ByVal nIndex As Integer, _
    ByVal dwNewLong As Long) As Long
    
Global Const GWL_STYLE = (-16)
Global Const WS_SYSMENU = &h80000

Sub RemoveControlMenu()
    Dim WindowStyle As Long
    Dim hWnd As Long
    Dim WindowName As String
    WindowName = Application.Caption
    hWnd = FindWindowA(0&, ByVal WindowName)
    WindowStyle = GetWindowLongA(hWnd, GWL_STYLE)
    WindowStyle = WindowStyle And (Not WS_SYSMENU)
    result = SetWindowLongA(hWnd, GWL_STYLE, WindowStyle)
End Sub

Sub RestoreControlMenu()
    Dim WindowStyle As Long
    Dim hWnd As Long
    Dim WindowName As String
    WindowName = Application.Caption
    hWnd = FindWindowA(0&, ByVal WindowName)
    WindowStyle = GetWindowLongA(hWnd, GWL_STYLE)
    WindowStyle = WindowStyle Or WS_SYSMENU
    result = SetWindowLongA(hWnd, GWL_STYLE, WindowStyle)
End Sub

© Microsoft Excel 97 Developer's Handbook
© Author's : Eric Wells, Steve Harshbarger
3. Различие в способах передачи аргументов [См. выше]
Ответить с цитированием
  (#7 (permalink)) Старый
Яйцеголовый Яйцеголовый вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2005
По умолчанию 17.06.2005, 20:06

Спасибо большое pashulka и за этот ответ, тоже помогло.
В прошлом вопросе по пункту 1 я имел виду полосы прокрутки, как Вы провильно заметили.
Вот только не знаю как прицепить (показать) здесь в форуме скриншот с открывающимися меню.
А в целом задача почти решена.
Ответить с цитированием
  (#8 (permalink)) Старый
dorofei dorofei вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.07.2005
По умолчанию 20.07.2005, 14:03

У меня тоже такая проблема и из этой темы много-чего узнал. Но есть маленькая проблема. Я создал в контексном меню подменю, но не могу добавить в нем команды. Подскажите, пожалуйста, как добавить команду в этот подменю.

Я вот так создал подменю:
Код:
With Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Temporary:=True)
     .Caption = "Открыть пример4"
End With
Заранее спасибо!
Ответить с цитированием
  (#9 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 20.07.2005, 15:14

Выбирайте тот подвариант, который Вам больше подходит :

Код:
With Application.CommandBars("Cell").Controls _
    .Add(Type:=msoControlPopup, Temporary:=True)
    .Caption = "Открыть пример4"
    With .Controls.Add(msoControlButton)
         .Caption = "Просто кнопка1"
         .OnAction = "OpenWorkbook"
    End With
    With .Controls.Add(msoControlButton)
         .Caption = "Просто кнопка2"
         .OnAction = "CloseWorkbook"
    End With
End With
Код:
With Application.CommandBars("Cell")
     With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
          .Caption = "Открыть пример4"
          With .Controls.Add(msoControlButton)
               .Caption = "Просто кнопка1"
               .OnAction = "OpenWorkbook"
          End With
          With .Controls.Add(msoControlButton)
               .Caption = "Просто кнопка2"
               .OnAction = "CloseWorkbook"
          End With
     End With
End With
Код:
With Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Temporary:=True)
     .Caption = "Архив"
     With .Controls
          With .Add(Type:=msoControlButton)
               .FaceId = 66
               .Caption = "Просто кнопка1"
               .OnAction = "OpenWorkbook"
          End With
          With .Add(Type:=msoControlButton)
               .FaceId = 42
               .Caption = "Просто кнопка1"
               .OnAction = "CloseWorkbook"
          End With
     End With
End With
Ответить с цитированием
  (#10 (permalink)) Старый
dorofei dorofei вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.07.2005
По умолчанию 21.07.2005, 05:22

Спасибо за помошь!
Ответить с цитированием
  (#11 (permalink)) Старый
Mikluho Mikluho вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2006
По умолчанию 08.02.2006, 12:53

Доброе всем !
Вопрос такого плана и скорее всего именно здесь...
При нажатии правой кнопки мыши на рабочей области не отображается контекстное меню, также не отображается это меню при нажатии ПКМ на листах и на строке состояния...
Ни один из вышеперечисленных способов сокрытия меню в Personal.xls не найден...
Каким образом это можно исправить ?
Ответить с цитированием
  (#12 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 08.02.2006, 14:22

Заблокировать контекстное меню очень просто ... для этого в любой рабочей книге, достаточно выполнить инструкцию :
Код:
Application.CommandBars("Cell").Enabled = False
и контекстное меню, которое появляется после клика мышкой в ячейке рабочего листа, больше отображаться не будет (конечно при условии, что Вы сохраните изменения)

Вернуть всё на круги своя можно, например так :
Код:
Application.CommandBars("Cell").Enabled = True
P.S. В принципе, Вы можете разблокировать все контекстные меню, например так :
Код:
For Each iCommandBar In Application.CommandBars
    If iCommandBar.Type = msoBarTypePopup Then _
       iCommandBar.Enabled = True
Next
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Mikluho Mikluho вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2006
По умолчанию 08.02.2006, 15:45

Спасиб большой, восстановил меню в рабочей области..
Но ввиду того что я не программист, вставил эту инструкцию в Личную книгу Макросов Personal.xls и при каждой загрузке любого Excel файла выполняю данный макрос.
Отсюда 2 вопроса
Можно ли сделать так, чтобы при открывании/создании любого Excel файла это делалось автоматически ?
Какое обозначение у контекстных меню на строке состояния и на ярлычках листов ?
Ответить с цитированием
  (#14 (permalink)) Старый
Mikluho Mikluho вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2006
По умолчанию 08.02.2006, 15:47

Всё !! Респект огромный !
На второй вопрос ответил Постскриптумом, теперь всё работает.
Thanx
Ответить с цитированием
  (#15 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 08.02.2006, 17:50

1. Запускать макрос при открытии и/или создании любой рабочей книги конечно можно, но на мой взгляд, делать этого не нужно, потому что :
- вышеопубликованный макрос (который разблокирует все контекстные меню) достаточно выполнить всего один раз и сохранить изменения.
- если подобное безобразие будет повторяться, то нужно "лечить болезнь", а не "бороться" с последствиями, т.е. искать источник (макрос) возникновения подобных проблем, а он может располагаться в любой рабочей книге.
Впрочем, если в макросе используются имена панелей, то рабочую книгу, которая содержит подобный макрос, можно обнаружить, если использовать самый обычный поиск файлов, указав в качестве критерия поиска [искать текст/слова] имя панели (желательно без кавычек)
2. Если надумаете воспользоваться поиском, то контекстные меню на которые Вы намекали в прошлом сообщении - это : "Ply" и "AutoCalculate"
Код:
Application.CommandBars("Ply").ShowPopup
Application.CommandBars("AutoCalculate").ShowPopup
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FN клавиша (ее настройка) jhkavkaz Ноутбуки и нетбуки 0 17.11.2011 23:06
Не работает клавиша вправо на клавиатуре lyoha100 Периферия 1 10.11.2011 20:29
на ноутбуке не работает клавиша enter Dinni Любые вопросы от новичков 1 15.02.2011 02:09
Подскажите где поменять в настройках колонки левая на правая? птица Любые вопросы от новичков 3 10.11.2010 23:16
listEdit и клавиша Enter Altur Prolog 7 04.01.2010 22:07
Курсор мыши двигается сам по себе в состоянии покоя мыши. OSS Любые вопросы от новичков 3 30.12.2008 12:06
Колонки "Левая-правая" OPEOP Звук и акустические системы 5 12.10.2008 22:21
Как проверить, нажата ли правая кнопка мыши night-stels Visual C++ 11 11.08.2008 22:45
Как сделать так, чтобы в событии OnKeypress определялась клавиша Enter 000Majestic000 Delphi 1 17.07.2007 20:13
Клавиша влево Olala Visual Basic 1 20.09.2005 17:50
Клавиша Escape и немодальное окошко VL-88 Visual C++ 2 01.10.2004 10:26
Как определить когда была нажата клавиша перемещения курсора DarkStar C++ Builder 14 30.01.2004 17:18



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов