C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ContextMenuStripがキー入力を受け取らない


(過去ログ 119 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69745 / inTopicNo.1)  ContextMenuStripがキー入力を受け取らない
  
□投稿者/ くま (38回)-(2014/01/26(Sun) 11:32:07)

分類:[VB.NET/VB2005 以降] 

開発環境 VisualStudio.NET 2010 vb.net

タスクトレイに常駐するアプリケーションを作成しています。

formにhogeMenyuStripというコンテキストメニューストリップを登録し、
ホットキー押下時にメニューを表示、選択した項目の値をペーストする
というものです。

簡単ですがコーディングは以下のような感じです。

'コンテキストメニューにデータを登録
Private Sub dataHenshu()
 Dim dataList = New ContextMenuStrip
 Dim item = New MyMenuItem

 item.Text = ”項目名”
 item.Tag = ”値”
 dataList .Add(item)
 AddHandler item.Click, AddressOf Clicked

 Me.hogeMenuStrip = dataList
End sub

'コンテキストメニューの項目をクリックした時
Private Sub Clicked(ByVal sender As Object, ByVal e As EventArgs)

 Clipboard.SetText(CType(sender, MyMenuItem).Tag)
 SendKeys.Send("^(v)")

End Sub

'ホットキーが押された時
Protected Overrides Sub WndProc(ByRef m As Message)

 base.WndProc(m)
 if m.Msg == WM_HOTKEY Then
  dataHenshu()
  Me.hogeMenuStrip.Show(Cursor.Position)
 End If

End Sub

'項目設定用
Public Class MyMenuItem
Inherits ToolStripMenuItem
Public Shadows Tag As Object

End Class


メニュー表示⇒項目選択⇒値ペーストの機能は問題なく動作したのですが、コンテキストメニューを
表示した時にタスクバーにバーが表示されてしまうため、ホットキーが押された時に以下の設定を
することで回避しました。

Me.TopMost = true

しかしこの設定をすると、ContextMenuStripがキー入力を受け取らなくなるようで、
SendKeys.Send("^(v)")が機能しなくなります。


検索して調べてみたのですが、解決策が見つかりません。
どなたか解決策をご存知の方がいらっしゃいましたらご教授下さい。
よろしくお願いいたします。
引用返信 編集キー/
■69787 / inTopicNo.2)  Re[1]: ContextMenuStripがキー入力を受け取らない
□投稿者/ shu (477回)-(2014/01/29(Wed) 16:45:49)
No69745 (くま さん) に返信

> しかしこの設定をすると、ContextMenuStripがキー入力を受け取らなくなるようで、
> SendKeys.Send("^(v)")が機能しなくなります。
>
キー送信が行われないのではなく対象となるウィンドウがアクティブになっていないのでは
ないでしょうか?

引用返信 編集キー/
■69813 / inTopicNo.3)  Re[2]: ContextMenuStripがキー入力を受け取らない
□投稿者/ くま (39回)-(2014/01/31(Fri) 07:15:36)
> shu さん

ありがとうございます。

なるほど、
SendKeys.Send("^(v)")が呼ばれる前に、直前のウィンドウがアクティブになる処理を
入れればよいと言うことですね?


どう実装すればよいのか知識がないので、いろいろ調べてみますm(__)m
引用返信 編集キー/
■69883 / inTopicNo.4)  Re[3]: ContextMenuStripがキー入力を受け取らない
□投稿者/ くま (40回)-(2014/02/06(Thu) 07:29:37)
以下のような処理を追加して、直前のウィンドウがアクティブになるようにはできたのですが、
SendKeys.Send("^(v)")で貼り付けできる時とできない時があり、動作が不安定です。
原因が分かる方がいらっしゃいましたらご教授下さい。
よろしくお願いいたします。

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
End Function

Public Function GetText(ByVal hWnd As IntPtr) As String
Dim length As Integer
If hWnd.ToInt32 = 0 Then
Return Nothing
End If
length = GetWindowTextLength(hWnd)
If length = 0 Then
Return Nothing
End If
Dim sb As New System.Text.StringBuilder("", length)
GetWindowText(hWnd, sb, sb.Capacity + 1)
Return sb.ToString()
End Function

Me.TopMost = Trueの前にアクティブウィンドウのタイトル名を取得
Dim AWhwnd As IntPtr = GetForegroundWindow()
Dim activeWindowName As String = GetText(AWhwnd)
Me.TopMost = True

'直前にアクティブだったウィンドウをアクティブにする
AppActivate(activeWindowName)
SendKeys.Send("^(v)")
引用返信 編集キー/
■69901 / inTopicNo.5)  Re[4]: ContextMenuStripがキー入力を受け取らない
□投稿者/ くま (41回)-(2014/02/07(Fri) 20:37:05)
自己解決しました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -