- PR -

アクティブじゃないフォームのキーイベント取得について

1
投稿者投稿内容
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2007-01-23 16:29
こんにちは。いつもお世話になっております。
ファンクションキーを押下すると、そのボタンの色が変わり、
イベントを発生させ、ボタンを離すと色を戻すユーザーコントロールを
作成中です。
フォームに貼り付けて実行すると、イベントの取得で、何もしなければ
色は表示→非表示となります。
が、別のフォームを開いたり、印刷やMessageBoxなどの処理を
行うと、色が指定した表示のままです。
フォームがアクティブじゃないので、ユーザーコントロールのKeyUpイベントが
発生していません。
汎用させるために、フォーム側ではユーザーコントロールの外観を変えたりなどの
処理はできません(仕様)
アクティブではないフォームのKeyUpイベントはどうやって取得すれば
いいのでしょうか?それともKeyUpイベントではいけないのでしょうか?
キーを離した状態ならLeaveでもいいのかと実行しましたが、
上手くいきませんでした。
どなたか知恵をお貸しください。よろしくお願いいたします。


コード:
Private Sub FuncKey_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp, Button1.KeyUp
        Select Case e.KeyCode
            '色を戻します
            Case Keys.F1
                 Me.Button1.BackColor = Me.BackColor
         e.Handled = True
        End Select
End Sub

 Private Sub FuncKey_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
	Select Case e.KeyCode
            '色をつけます
            Case Keys.F1
                 Me.Button1.BackColor = Color.DeepPink : RaiseEvent PFKeyPress(KeyCode)
         e.Handled = True
        End Select
End Sub

’***フォーム側***
Private Sub FuncKey1_PFKeyPress(ByVal KeyCode As Integer) Handles FuncKey1.PFKeyPress
        Select Case KeyCode
        '別のフォームを開く
         Case Keys.F1
             Dim fm As New Form2()
             Form2.Show()
	End Select
End Sub

KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2007-01-23 16:44
素直に言葉通りのことを実現するのは無理があるような気がします・・・。
たとえば、アクティブなフォームでキーイベントだけを拾って、当該のフォームにイベントを投げるような方法ではいけませんか?
イベントが意図的に拾えない(ダイアログ表示状態、別アプリケーションがフォーカスを持っている。)状態であれば、キーイベントのみを監視するような別のアプリケーションが必要になってくるかと思います。
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-01-23 17:48
ユーザコントロールからフォームのPFイベントをRaiseするのを
KeyDownではなくKeyUpにするのはダメですかね?

押した時ではなく、離したときにイベント起きるのはマズイ?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-23 19:55
引用:

りんごさんの書き込み (2007-01-23 16:29) より:

別のフォームを開いたり、印刷やMessageBoxなどの処理を行うと、色が指定した表示のままです。
フォームがアクティブじゃないので、ユーザーコントロールのKeyUpイベントが発生していません。
(snip)
アクティブではないフォームのKeyUpイベントはどうやって取得すればいいのでしょうか?


アクティブでなくなった時点で、キーイベントのお仕事ではないです。
アクティブでなくなった以降は、その Form のお仕事ではないです。

ということで、Deactivate イベントで元の色に戻しましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2007-01-24 09:46
KIMERA様、未記入様、じゃんぬねっと様
ご返信ありがとうございます。

引用:
キーイベントのみを監視するような別のアプリケーションが必要になってくるかと思います


他の開発者に相談したのですが、却下されてしまいました・・スミマセン。

引用:
押した時ではなく、離したときにイベント起きるのはマズイ?


やってみました。でも何故だか分からないのですが、PFKeyPressイベントが
起きたり起きなかったりするのです。

引用:
アクティブでなくなった以降は、その Form のお仕事ではないです。


フォーム側に追加してみると非表示になりました。
(フォーム側にコード追加するしかないのですよね?)
ユーザーコントロール側からParentFormのDeactivateイベントを取得
できないのでしょうか?

コード:
Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
        Dim i As Integer
        For i = 0 To 11
            Me.FuncKey1.PFKey(i).BackColor = Me.Panel1.BackColor
        Next i
    End Sub

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-24 10:07
引用:

りんごさんの書き込み (2007-01-24 09:46) より:

フォーム側に追加してみると非表示になりました。
(フォーム側にコード追加するしかないのですよね?)
ユーザーコントロール側からParentFormのDeactivateイベントを取得できないのでしょうか?


できますよ。

親 Form のインスタンスさえわかっていれば、イベント プロシージャに紐付けができます。
AddHandler でも、WithEvents でも、お好きな方をお使いください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2007-01-24 10:36
じゃぬねっと様、いつもご返信ありがとうございます。

引用:
親 Form のインスタンスさえわかっていれば、イベント プロシージャに紐付けができます。
AddHandler でも、WithEvents でも、お好きな方をお使いください



コード:
AddHandler Me.ParentForm.Deactivate, AddressOf FuncKey_Deactivate



ユーザーコントロールのLoad時に上記を行い、イベント取得できました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)