tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル他のWindowにVK_MENUを送信してメニューをアクティブにする
記事No2485
投稿日: 2005/10/29(Sat) 02:38
投稿者YAS
参照先http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/
[OSのVer]:Windows    [VBのVer]:VB.NET
いつもお世話になっております。

スクリーンキーボードを作っています。
keybd_eventで仮想キーコードを送ることで実現できましたが,
AltキーとF10だけどうしても機能しません。
Spy++で調べましたが,確かに対象のウィンドウにVK_MENUが
送られているのですがソフトのメニューがアクティブになりません。
同じコードでVK_A〜VK_ZやVK_CONTROL,VK_SHIFTは機能します。

Windows付属のスクリーンキーボードではAltキーをクリックすると
VK_MENUが送信された後にWM_SYSCOMMANDが送られているようです。
このWM_SYSCOMMANDも自前で送信するのでしょうか。

WindowsはXPで対象としたウィンドウはWORDです。またVBは2005β2です。

ご存じの方がいらっしゃいましたらご教授をお願いいたします。

[ツリー表示へ]
タイトルRe: 他のWindowにVK_MENUを送信してメニューをアクティブにする
記事No2486
投稿日: 2005/10/29(Sat) 09:23
投稿者花ちゃん
ひょっとして Keys.Alt を送っていませんか? 
Private Const VK_MENU = &H12 を送っていますか?

チョッと試したところ、VK_MENU = &H12 は送れましたが、Keys.Alt では、エラーが
発生しました。(VB.NET 2003)

VK_MENU = &H12 を使っているなら、同時に MapVirtualKey API関数も使っておられますか?

[ツリー表示へ]
タイトルRe^2: 他のWindowにVK_MENUを送信してメニューをアクティブにする
記事No2487
投稿日: 2005/10/29(Sat) 12:42
投稿者YAS
参照先http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/
[OSのVer]:Windows    [VBのVer]:VB.NET  
花ちゃんさん,ありがとうございます。

> ひょっとして Keys.Alt を送っていませんか? 
> Private Const VK_MENU = &H12 を送っていますか?

はい,VK_MENU = &H12 を定義して送っています。

> VK_MENU = &H12 を使っているなら、同時に MapVirtualKey API関数も使っておられますか?

はい,MapVirtualKeyを使って次のようなコードで送信しています。
ExtendedKeyFlag()は仮想キーコードの種類に応じてKEYEVENTF_EXTENDEDKEYを返す自作の関数です。

keybd_event(bVk, MapVirtualKey(CInt(bVk), 0), ExtendedKeyFlag(bVk) Or 0, 0)
keybd_event(bVk, MapVirtualKey(CInt(bVk), 0), ExtendedKeyFlag(bVk) Or KEYEVENTF_KEYUP, 0)

また,Spy++で送信先のWORDへのメッセージを見ると,

P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
P WM_SYSKEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode38 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

となっています。

本物のAltキーを押した場合には,上の2つと全く同じメッセージの後に,

S WM_SYSCOMMAND uCmdType:SC_KEYMENU xPos:0 yPos:0(ニーモニックを使用)
R WM_SYSCOMMAND

というメッセージが流れているようです。
こちらのサンプル集とPINVOKE.NETを参考にSendInputでも試したのですが,同じ結果でした。
また,KEYDOWNだけを送ってもだめでした。
VBが2005β2のためかもしれませんので,VB2003で試してみます。

[ツリー表示へ]
タイトルRe^3: 他のWindowにVK_MENUを送信してメニューをアクティブにする
記事No2488
投稿日: 2005/10/29(Sat) 14:26
投稿者花ちゃん

下記コードでも送れないでしょうか?

    Call keybd_event(Keys.Menu, MapVirtualKey(Keys.Menu, 0), _
                    KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(Keys.V, MapVirtualKey(Keys.V, 0), _
                    KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(Keys.V, MapVirtualKey(Keys.V, 0), _
                    KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    Call keybd_event(Keys.Menu, MapVirtualKey(Keys.Menu, 0), _
                    KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)

[ツリー表示へ]
タイトルRe^4: 他のWindowにVK_MENUを送信してメニューをアクティブにする
記事No2489
投稿日: 2005/10/30(Sun) 06:23
投稿者YAS
参照先http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/
[OSのVer]:Windows    [VBのVer]:VB.NET  
花ちゃんさん,ありがとうございます。

花ちゃんさんのコードを試しましたがメニューは表示されませんでした。
ただ,Keys.MenuでもVK_MENUでもWORDに仮想キーコード&H12は届いている
ようです。「ファンクションキーの表示」ツールバーがAltを押したとき
と同じように変化します。Spy++で見てもメッセージは確実に届いています。
でもなぜかアプリのメニューがアクティブになりません。
何か大きな勘違いがあるような気がします。もう少し色々試してみます。

[ツリー表示へ]