以下の段階までは自力で調べ上げコーディングしたのですが目的を達する
ことが出来ませんでした。何かバグ取りをお願いするようで心苦しいのですがVB.NETでAPIを使用するのは初めてに等しく、クラスの作成ははじめてなのでどこか間の抜けたこと・考え違いがあると思います。
どうかご教授のほどお願いいたします。
以下のコードでキー入力をしても一切反応が返って来ません。
逆に下から2行目をコメントアウトするとフォーム部分でIMEが起動します。
標準モジュールに
'------ウィンドウに関連付けされた入力コンテキストを-------
' 取得する関数の宣言
Declare Function ImmGetContext Lib "imm32.dll" _
(ByVal Handle As IntPtr) As IntPtr
'------ウィンドウに関連付けされた入力コンテキストを-------
' 解放する関数の宣言
Declare Function ImmReleaseContext Lib "imm32.dll" _
(ByVal Handle As IntPtr, ByVal hIMC As IntPtr) As Integer
'------IMEのオープン・クローズを設定する--------
Declare Function ImmSetOpenStatus Lib "imm32.dll" _
Alias "ImmSetOpenStatus" (ByVal himc As IntPtr, ByVal fOpen As Integer) As Integer
を宣言し、
フォームで
Private Class MyEditBox
Inherits PictureBox
Protected Overrides Sub WndProc(ByRef m As Message)
'後にメッセージを処理し、オリジナルな描画等をする。
MyBase.WndProc(m)
End Sub
End Class
Private WithEvents MyEdit As New MyEditBox
Dim lngImeContext As IntPtr '入力コンテキストの取得用
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SuspendLayout()
'カスタムPictureBoxの作成
MyEdit.Name = "EditBox"
MyEdit.Size = New Size(500, 500)
MyEdit.BackColor = Color.White
MyEdit.Location = New Point(20, 20)
Me.Controls.Add(MyEdit)
ResumeLayout()
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
' 入力コンテキストを解放
ImmReleaseContext(MyEdit.Handle, lngImeContext)
End Sub
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
'ピクチャボックス上でIME入力を可能にしたい。。
lngImeContext = ImmGetContext(MyEdit.Handle)
Dim ret As Integer
ret = ImmSetOpenStatus(lngImeContext, True)
MyEdit.Focus() ’<ここをコメントアウトするとフォーム左上端にIME入力が可能になる。
End Sub
実行してないんでアレですが、一番根本的なところで PictureBox って
フォーカス受け取るの?…ってのが最初に浮かんだ疑問。
[Control.Focus メソッド]
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassfocustopic.asp
思いっきり[解説]には選択できないって書いてありますが…。
…しかし、さっきテストしたら
[VB.NET]
With Me.PictureBox1
Debug.WriteLine(.CanFocus)
Debug.WriteLine(.Focus)
Debug.WriteLine(.ContainsFocus)
End With
全部 True で返ってきた…うーん…関係ないかもw。
でも、とりあえず明らかにフォーカスを受け取るコントロール
でテストしてみる事をお勧めします。
DLLの宣言で不安があるなら
[PAPA'n VB (ぱぱんぶぃびぃ) MS-IMEのソフトキーボードを表示する]
http://www.sugi-family.net/papanvb/vbnet_tips.php?cate=37&tips=37001
更に基本的な解説は
[@IT TIPS:Win32 APIやDLL関数を呼び出すには?]
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
PictureBoxをRichTextBoxの様にしたいということですか、結構茨の道ですね。
文字入力に関してはキャレットが出てこないんじゃ直接は、無理ではないでしょうか。
文字の入力の場所指定が出来てるなら、入力の時だけTextBoxをそっと出す方式も
有りかな。ただし文字編集はかなり難しい、結局はRichTextBoxの様に文字の
情報を内部に持つことになるのかな、頑張ってください。
特攻隊長まるるう様・ねろ様、レスありがとうございます。
特攻隊長まるるう様にご紹介していただいた場所は永久保存版と
させていただきました。
ねろ様には以前にもお世話になりました。あれから少し完成にむけ努力
したのですが、だんだん欲が出てきてもう少し速く良い物にするには
と思いIMEを制御できないかと考えました。
とりあえず今日はお礼までとし、後日改めて検討の結果をご報告したいと
思います。
特攻隊長まるるう様、
PictureBoxにはGotFocusイベントがあるのでMSDNの記載ミスでは
ないかと思います。
同様のコードはVB5では動きました。
これは推測ですがVB5のPictureBoxにはKeyDown/KeyUp/KeyPress
等のイベントがあるのに対しVB.NETにはそれがないのが原因では
ないかと思います。
ねろ様ご指摘の入力の時だけTextBoxをそっと出す方式も以前試したのですが
初心者掲示板での以下の私の質問でも簡単には解決できそうにありませんでした。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200505/05050093.txt
可能性として以下の「フォーム内にフォームを描画する」で
http://dobon.net/vb/dotnet/form/formwithinform.html
一からやる手段もありそうですが、上記の問題などとのかねあいもあり
やはりとんでも無いことになりそうです。
リッチテキストボックスでAPIというか、メッセージを横取りしてフォン
トをセットしなおしたりもしたのですが
MyBase.WndProc(m) の中でかなりのことをしているようで
その程度のことではだめでした。描画までを処理しなければ
ならないようです。
自作のソフトへの簡単なスクリプトもどきを動作させるためのエディタ
ですので私の能力では、ひとまず現在の水準で妥協し、VS2005を待っ
てみようと思います。
皆様お世話になりました。とりあえず解決とさせていただきます。
すいません。解決のクリックを忘れていました。
ツイート | ![]() |