DOBON.NET DOBON.NETプログラミング掲示板過去ログ

スクリーンキーボードのシフトキー

環境/言語:[VB2005SP1 WinXPSP3]
分類:[.NET]

 スクリーンキーボードをYAS's さんの VB2005Tipsのスクリーンテンキーパッドを
参考に作成中ですが、英字の大小文字でつまずいています。
 通常スクリーンキーボードをクリックすると"abc"となるのですが
これをシフトキーを押した後だと"ABC"と入力できるようにしたいのです。

入力の簡単なソースを張ります。

<DllImport("user32.dll")> _
Private Function SendInput( _
ByVal nInputs As Integer, _
ByRef pInputs As INPUT, _
ByVal cbSize As Integer) _
As Integer
End Function

Private Sub SendInput(ByVal VirtualKeyCode As wVk, ByVal Flag As dwFlags)
Dim inputevents As New INPUT
inputevents.type = type.INPUT_KEYBOARD
inputevents.ki.wVk = VirtualKeyCode
inputevents.ki.wScan = CShort(MapVirtualKey(CInt(VirtualKeyCode), 0))
inputevents.ki.dwFlags = ExtendedKeyFlagW(VirtualKeyCode) Or Flag
inputevents.ki.time = 0

inputevents.ki.dwExtraInfo = GetMessageExtraInfo()
SendInput(1, inputevents, Marshal.SizeOf(inputevents))
End Sub

Private Function ExtendedKeyFlagW(ByVal Key As wVk) As dwFlags
Dim Flag As dwFlags = 0
Select Case Key
Case wVk.VK_CANCEL, wVk.VK_PRIOR, wVk.VK_NEXT, wVk.VK_END, wVk.VK_HOME, _
wVk.VK_LEFT, wVk.VK_UP, wVk.VK_RIGHT, wVk.VK_DOWN, _
wVk.VK_SNAPSHOT, wVk.VK_INSERT, wVk.VK_DELETE, _
wVk.VK_DEVIDE, wVk.VK_NUMLOCK, wVk.VK_RSHIFT, wVk.VK_RCONTROL, wVk.VK_RMENU
Flag = dwFlags.KEYEVENTF_EXTENDEDKEY
End Select
Return Flag
End Function

 自分のキーボードのシフトキーを押しながらスクリーンキーボードをたたくと
大文字ではいるのですがそれでは意味がないです。
 Windowsのスクリーンキーボードではできるのでできると思っているのですが
デバッグでとめているとフリーズして調査できません。

どなたかご教授お願いします。
■No22123に返信(mezashiさんの記事)

シフトキー押下時にa→A、または A→aにならない
という質問内容は分かりますが、

ソース載せられても、不明なのです。
ぱっと見ただけで、なんにも分からなかったのですが、
何に悩んでるのでしょうか?

1.シフトキーを押したら、フラグを立てる
2.フラグが立っているなら、a→A、または A→aに変換
3.シフトキーを再度押したら、フラグをクリアする

だけな気がしますが

どの状態で悩んでいるのか、情報が欲しいけどね。
■No22124に返信(やじゅさんの記事)
> 1.シフトキーを押したら、フラグを立てる
> 2.フラグが立っているなら、a→A、または A→aに変換
> 3.シフトキーを再度押したら、フラグをクリアする

回答ありがとうございます。
わかりにくくてすいません。まさに上のおっしゃった内容のとおりです。
SendInput(1, inputevents, Marshal.SizeOf(inputevents))
で打ち込んだ文字を書き込むのですが、どおやってシフトキーの
フラグを盛り込むかがわかりません。
ちなみにシフトフラグ時はa→Aとしたいです。
■No22133に返信(mezashiさんの記事)

Shiftキーが押されているかどうかは、↓を参照
http://dobon.net/vb/dotnet/system/modifierkeys.html

SHIFTキーを同時に押したらをSendInputに当てはめるには
inputeventsを配列にして、2つの構造体をSendInputに
一括送信すればいい。
SendInput関数を使ってキーストロークをシミュレートする
http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm


SendInput(2, inputevents(0), Marshal.SizeOf(inputevents(0)))


キー取得方法はこちらもありえる。
DirectInputを使う方法
http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse3.html

スクリーンキーボードを作る
http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm
■No22134に返信(やじゅさんの記事)
> SHIFTキーを同時に押したらをSendInputに当てはめるには
> inputeventsを配列にして、2つの構造体をSendInputに
> 一括送信すればいい。

やじゅさん ありがとうございました!!
配列一括渡しでできました。
的確な指摘ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板