[[20150212170635]] 『オートシェイプに対する右クリックの無効化』(ナック28) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オートシェイプに対する右クリックの無効化』(ナック28)

オートシェイプに対する右クリックを無効とすることはできますでしょうか。
プロパティのロックをオンとしてシートを保護することでクリックできなくなることは承知しています。
シートを保護しなくてもオートシェイプを右クリックしたことにより、図形編集の頂点と線分を表示させたくありません。
APIを使ってできる方法がありましたら、教えて頂けると助かります。
宜しくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 邪道(?)ですが・・・

 標準モジュールに。
 一度だけ、Testを実行してください。
 そのあとは、オートシェープをクリックしようとしても、「弾き飛ばされます」

 Option Explicit
 Private Declare Function SetCursorPos Lib "User32" ( _
        ByVal x As Long, _
        ByVal y As Long _
        ) As Boolean

 Sub Test()
    Dim sp As Shape

    For Each sp In ActiveSheet.Shapes
        If sp.Type = msoAutoShape Then sp.OnAction = "マウス移動"
    Next

 End Sub

 Sub マウス移動()
    SetCursorPos 10, 10
 End Sub

(β) 2015/02/12(木) 18:42


 ↑ よく考えたら、「弾き飛ばさなくてもOK」でした。SetCursorPosは不要です。

 Sub Test()
    Dim sp As Shape

    For Each sp In ActiveSheet.Shapes
        If sp.Type = msoAutoShape Then sp.OnAction = "クリック無効"
    Next

 End Sub

 Sub クリック無効()
 End Sub

(β) 2015/02/12(木) 18:45


 ↑ あぁ、右クリック でしたね。
 ちょっと考えてみます。

(β) 2015/02/12(木) 18:47


 とりあえずの、これまた邪道(?)です。
 オートシェープの上にマウスが来たら、はじきとばします。
 裏で監視ループを回しますので、操作が若干重くなるかもしれませんが、とりあえず、手持ちの材料で書きました。
 もっと、いい方法も探してみたいと思いますし、識者の方からの回答も期待しています。

 監視をとめたければ 監視終了を実行してください。

 標準モジュール

 Option Explicit

 Private Declare Function GetCursorPos Lib "User32" (lpPoint As POINTAPI) As Long
 Private Declare Function SetCursorPos Lib "User32" ( _
        ByVal x As Long, _
        ByVal y As Long _
        ) As Boolean

 Type POINTAPI
    x As Long
    y As Long
 End Type

 Dim DoLoop As Boolean

 Sub 監視開始()
    Dim vv As Object
    Dim MPt As POINTAPI

    DoLoop = True

    Do While DoLoop

        GetCursorPos MPt
        Set vv = ActiveWindow.RangeFromPoint(MPt.x, MPt.y)
        If Not vv Is Nothing Then
            If TypeName(vv) <> "Range" Then
                If vv.ShapeRange.Type = msoAutoShape Then
                    SetCursorPos 10, 10
                End If
            End If
        End If

        DoEvents
        DoEvents

    Loop

 End Sub

 Sub 監視終了()
    DoLoop = False
 End Sub

(β) 2015/02/12(木) 19:25


 こんなページがありました。

http://homepage1.nifty.com/rucio/main/tyukyu/tyukyu9.htm

 VBですけど、なんとなく使えそうですね。でも、フック同様、なまはんかに使うと、影響が甚大かも。
 私自身も、おもしろそうなので、よく読んで試してみようかとは思いますが、さて、どうなりますか。

 (ナック28)さん もトライされますか?

(β) 2015/02/12(木) 19:42


サブクラス化について勉強しようと思います。
貴重な情報をありがとうございました。
(ナック28) 2015/02/16(月) 11:26

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.