IME入力時に読みを別コントロールに設定できる仕様を追加して欲しいとの事。
結局、流れた案件だけど、ある程度の調査結果でも書いておきます。
(たまには技術屋らしい書き込みもしないとねσ(^_^汗
調べると、IME用のAPIを使うとの事。
で、WndProcをOverridesして操作が常道らしい。
まず、ModuleにAPI等を定義
------------------------------------------------------------
Imports System.Runtime.InteropServices
Public Module TestFuncs
#Region "API定数"
''' <summary>WindowMessage:WM_CHAR</summary>
Public Const WM_CHAR As Integer = &H102
''' <summary>WindowMessage:WM_IME_COMPOSITION</summary>
Public Const WM_IME_COMPOSITION As Integer = &H10F
''' <summary>ImmGetCompositionString用定数:GCS_RESULTREADSTR</summary>
Public Const GCS_RESULTREADSTR As Integer = &H200
#End Region
#Region "API定義"
''' <summary>IMEハンドル取得</summary>
<DllImport("Imm32.dll")> _
Public Function ImmGetContext(ByVal hWnd As Integer) As Integer
End Function
''' <summary>IMEハンドル解放</summary>
<DllImport("Imm32.dll")> _
Public Function ImmReleaseContext(ByVal hWnd As Integer, ByVal hIMC As Integer) As Integer
End Function
''' <summary>フリガナ取得</summary>
<DllImport("Imm32.dll")> _
Public Function ImmGetCompositionString(ByVal hIMC As Integer, ByVal dwIndex As Integer, ByVal lpBuf As StringBuilder, ByVal dwBufLen As Integer) As Integer
End Function
''' <summary>IME状態取得</summary>
<DllImport("Imm32.dll")> _
Public Function ImmGetOpenStatus(ByVal hIMC As Integer) As Integer
End Function
#End Region
End Moudle
------------------------------------------------------------
あとはテキストボックス継承のコントロールを作成
------------------------------------------------------------
Imports System.ComponentModel
Public Class TestTextBox
Inherits System.Windows.Forms.TextBox
''' <summary>読み設定先</summary>
Private _YomiControl As Control = Nothing
''' <summary>読み設定先コントロール</summary>
<Category("カスタム")> _
<Description("読み設定先コントロール")>
Public Property YomiControl() As Control
Get
Return _YomiControl
End Get
Set(ByVal value As Control)
_YomiControl = value
End Set
End Property
#Region "WndProcフック"
''' <summary>ウィンドウプロシージャ</summary>
Protected Overloads Overrides Sub WndProc(ByRef wm As System.Windows.Forms.Message)
Try
If Not _YomiControl Is Nothing Then
Select Case wm.Msg
Case WM_IME_COMPOSITION
'IME確定
Dim InpStr As String = ""
If (CUInt(wm.LParam) And CUInt(GCS_RESULTREADSTR)) <> 0 Then
Dim hIM As Integer = ImmGetContext(Me.Handle.ToInt32())
Dim strLen = ImmGetCompositionString(hIM, GCS_RESULTREADSTR, Nothing, 0)
If strLen > 0 Then
Dim temp As New System.Text.StringBuilder(strLen)
ImmGetCompositionString(hIM, GCS_RESULTREADSTR, temp, strLen)
InpStr = temp.ToString()
If InpStr.Length > strLen Then
InpStr = InpStr.Substring(0, strLen)
End If
Try
If Not _YomiControl Is Nothing Then
_YomiControl.Text = _YomiControl.Text & StrConv(InpStr, VbStrConv.Wide)
End If
Catch ex As Exception
End Try
End If
ImmReleaseContext(Me.Handle.ToInt32(), hIM)
End If
Exit Select
Case WM_CHAR
'直接入力
Dim hIM As Integer = ImmGetContext(Me.Handle.ToInt32())
If ImmGetOpenStatus(hIM) = 0 Then
Dim InpChr As Char = Convert.ToChar(wm.WParam.ToInt32() And &HFF)
If wm.WParam.ToInt32() >= 32 Then
Dim InpStr As String = InpChr.ToString()
Try
If Not _YomiControl Is Nothing Then
_YomiControl.Text = _YomiControl.Text & InpStr
End If
Catch ex As Exception
End Try
End If
End If
ImmReleaseContext(Me.Handle.ToInt32(), hIM)
Exit Select
End Select
End If
Catch ex As Exception
End Try
MyBase.WndProc(wm)
End Sub
#End Region
End Class
------------------------------------------------------------
とりあえずカナを取得して、指定の別コントロールに設定するソース。
2時間程度で調べて作ったものなのでバグ等があるやもしれませんがw
IT技術関連は.NETネタが主流のカキコになると思われます^_^;
まあヘッポコなので嘘の情報がまぎれているかも知れません。
ソースの流用はご自由に。ただし責任は取りません。
肥大型心筋症の為ICDを埋め込んでます。
諸々の雑談、巡った神社もUP
更新日付
最新投稿:大浦神社
投稿日:2026年4月13日
追記:吉備津彦神社
追記日:2026年5月7日
火縄銃演武
投稿日:2026年4月13日
追記:吉備津彦神社
追記日:2026年5月7日
火縄銃演武
2014年12月26日金曜日
2014年9月23日火曜日
薬の副作用が出ちゃったよぉ
退院してからほぼ1月。
いろいろありまして。
まず、ワーファリンが効きすぎていたようで緊急で点滴。
まあ、針が血管に当たらないw
結局 足から。結構痛い。
で、血液検査の結果、甲状腺が異常だと判明。
薬(アミオダロン)の量を増やした影響らしい。
薬の種類を変更しました。
ただ、甲状腺が正常化するまで数か月必要とのこと。
心臓薬のおかげか動悸等はないのですが
体重が減る減る。
1日で2キロ近く減った時はビビりましたw
今は、なんとか喰って維持していますが・・・
また、下痢もしてるんだよねぇ
腹痛は無いのですが
水っぽいのが屁と同時にブッパッと一気に噴出しますw
これも甲状腺異常の影響のようです。
やれやれ。。。。
いろいろありまして。
まず、ワーファリンが効きすぎていたようで緊急で点滴。
まあ、針が血管に当たらないw
結局 足から。結構痛い。
で、血液検査の結果、甲状腺が異常だと判明。
薬(アミオダロン)の量を増やした影響らしい。
薬の種類を変更しました。
ただ、甲状腺が正常化するまで数か月必要とのこと。
心臓薬のおかげか動悸等はないのですが
体重が減る減る。
1日で2キロ近く減った時はビビりましたw
今は、なんとか喰って維持していますが・・・
また、下痢もしてるんだよねぇ
腹痛は無いのですが
水っぽいのが屁と同時にブッパッと一気に噴出しますw
これも甲状腺異常の影響のようです。
やれやれ。。。。
2014年8月9日土曜日
ICDが動いてもた
8月2日、ICDがガツンと来ました。
数日前から体調は悪く息苦しかったのですが、少し歩いて椅子に座ると
ふらーっと頭が回った気がしてすぐガツンと。
で、即、病院に連れて行ってもらうように嫁に電話。
動作後は動作前より意識がはっきりして、普通に歩ける状態。
まあ入院は覚悟してました。
で、その夜。
病室で息が出来なくなり意識も失いました。
心不全だったそうです。
気が付くと、気管挿管されてました。
前から息をすると胸から「ゴロゴロ」と音がする感覚があったのですが
気を失う前は息を吸っても肺に届く感じがまったくしなかったです。
また、数日前から横になると息苦しく、座った方が楽でした。
深呼吸も出来ない状態です。
(典型的な心不全状態だったようです)
今は深呼吸も普通にできます。
かなり肺に水が入っていたようで、利尿剤が良く効いているみたいです。
そういえば、倒れる前、体重が増えていたような気もします。
で、5日ほどCCUに居たのですが、今は一般病棟です。
数日前から体調は悪く息苦しかったのですが、少し歩いて椅子に座ると
ふらーっと頭が回った気がしてすぐガツンと。
で、即、病院に連れて行ってもらうように嫁に電話。
動作後は動作前より意識がはっきりして、普通に歩ける状態。
まあ入院は覚悟してました。
で、その夜。
病室で息が出来なくなり意識も失いました。
心不全だったそうです。
気が付くと、気管挿管されてました。
前から息をすると胸から「ゴロゴロ」と音がする感覚があったのですが
気を失う前は息を吸っても肺に届く感じがまったくしなかったです。
また、数日前から横になると息苦しく、座った方が楽でした。
深呼吸も出来ない状態です。
(典型的な心不全状態だったようです)
今は深呼吸も普通にできます。
かなり肺に水が入っていたようで、利尿剤が良く効いているみたいです。
そういえば、倒れる前、体重が増えていたような気もします。
で、5日ほどCCUに居たのですが、今は一般病棟です。
2014年5月17日土曜日
VB2013ForWEBでデザインが~
次の案件をなかなか発注してくれないのでASP.NETのお勉強でも・・・
と思ってVS Express 2013 for WEB をインストール
あれ?デザインは?
HTMLをごりごり書くの?
以前のバージョンでは使えたと思ったけど・・・
ぁぁオプションでデザインが使えるようになるのね
デフォルトで使えるようにしてほしかったなw
やれやれ。。。。
と思ってVS Express 2013 for WEB をインストール
あれ?デザインは?
HTMLをごりごり書くの?
以前のバージョンでは使えたと思ったけど・・・
ぁぁオプションでデザインが使えるようになるのね
デフォルトで使えるようにしてほしかったなw
やれやれ。。。。
2014年4月16日水曜日
.NETでのPG間共通Configの更新方法
前回の共通ConfigでのConfig更新方法
(PGは再起動しないと取得できないので要注意)
前回は複数PGから同じConfigを参照する方法(applicationSettingだけ)を書いたけど
今回は、そのConfigの更新方法
(といってもxmlを更新する処理なだけだけどw)
いきなりサンプルソース
---------------------- コンフィグ更新用SUB[例] ----------------------------
Public Sub WriteAppConf(ByVal sName As String, ByVal sVal As String)
'構成ファイルのパスを取得
Dim asm As System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim appConfigPath As String
'ファイル指定
appConfigPath = System.IO.Path.GetDirectoryName(asm.Location) & _
"TestCommon.config"
'構成ファイルをXML DOMに読み込む
Dim xmldoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
xmldoc.Load(appConfigPath)
Dim xmlnode As System.Xml.XmlNode = _
xmldoc("TestSys.TestLibs.My.MySettings")
'ノードを探す
Dim n As System.Xml.XmlNode
Dim b As Boolean = False
For Each n In node.SelectNodes("setting")
If n.Attributes.GetNamedItem("name").Value = sName Then
For Each nn As System.Xml.XmlNode In n.SelectNodes("value")
nn.InnerText = sVal
b = True
Next
Exit For
End If
Next
If Not b Then
'新しいElementの作成
Dim newNode As System.Xml.XmlElement = doc.CreateElement("setting")
'Attributeを作成し、追加する
newNode.SetAttribute("name", sName)
newNode.SetAttribute("serializeAs", "String")
Dim newVale As System.Xml.XmlElement = doc.CreateElement("value")
newVale.InnerText = sVal
newNode.AppendChild(newVale)
node.AppendChild(newNode)
End If
'変更された構成ファイルを保存する
doc.Save(appConfigPath)
End Sub
---------------------------------------------------------------------------
共通Configファイル名 "TestCommon.config" と
DLL名前空間APPConfigノード名 "TestSys.TestLibs.My.MySettings" を
環境に合わせて変更すればConfig変更用モジュールの完成
使い方は
通常AppConfig
my.setting.XXXX = AAAA
共通AppConfig
WriteAppConf("XXXX",AAAA)
ただし、文字列の情報のみ保存にしています。
(PGは再起動しないと取得できないので要注意)
前回は複数PGから同じConfigを参照する方法(applicationSettingだけ)を書いたけど
今回は、そのConfigの更新方法
(といってもxmlを更新する処理なだけだけどw)
いきなりサンプルソース
---------------------- コンフィグ更新用SUB[例] ----------------------------
Public Sub WriteAppConf(ByVal sName As String, ByVal sVal As String)
'構成ファイルのパスを取得
Dim asm As System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim appConfigPath As String
'ファイル指定
appConfigPath = System.IO.Path.GetDirectoryName(asm.Location) & _
"TestCommon.config"
'構成ファイルをXML DOMに読み込む
Dim xmldoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
xmldoc.Load(appConfigPath)
Dim xmlnode As System.Xml.XmlNode = _
xmldoc("TestSys.TestLibs.My.MySettings")
'ノードを探す
Dim n As System.Xml.XmlNode
Dim b As Boolean = False
For Each n In node.SelectNodes("setting")
If n.Attributes.GetNamedItem("name").Value = sName Then
For Each nn As System.Xml.XmlNode In n.SelectNodes("value")
nn.InnerText = sVal
b = True
Next
Exit For
End If
Next
If Not b Then
'新しいElementの作成
Dim newNode As System.Xml.XmlElement = doc.CreateElement("setting")
'Attributeを作成し、追加する
newNode.SetAttribute("name", sName)
newNode.SetAttribute("serializeAs", "String")
Dim newVale As System.Xml.XmlElement = doc.CreateElement("value")
newVale.InnerText = sVal
newNode.AppendChild(newVale)
node.AppendChild(newNode)
End If
'変更された構成ファイルを保存する
doc.Save(appConfigPath)
End Sub
---------------------------------------------------------------------------
共通Configファイル名 "TestCommon.config" と
DLL名前空間APPConfigノード名 "TestSys.TestLibs.My.MySettings" を
環境に合わせて変更すればConfig変更用モジュールの完成
使い方は
通常AppConfig
my.setting.XXXX = AAAA
共通AppConfig
WriteAppConf("XXXX",AAAA)
ただし、文字列の情報のみ保存にしています。
登録:
投稿 (Atom)