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

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

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

Editボックスに簡体字をセットする方法

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

■93935 / inTopicNo.1)  Editボックスに簡体字をセットする方法
  
□投稿者/ 山猿 (1回)-(2020/02/22(Sat) 23:05:05)

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

お世話になります。
以下の様なコードで、Editボックス(IEのGoogle検索ボックス等)に中国簡体字(utf-8)をセットしようとしましたが、簡体字部分が?になってしまいます。
&#36213;治&#21195;→?治?
適切な対処方法をご存知の方、おられましたらご教示頂けませんでしょうか。

Declare Function SendMessageStr Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal MSG As Integer,
ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As Integer
Const WM_SETTEXT = &HC


'utf-8文字
Dim sb = New StringBuilder("", 256)
sb.Clear()
sb.Append("&#36213;治&#21195;")
SendMessageStr(hwnd, WM_SETTEXT, Len(sb.ToString), sb)


宜しくお願い致します。

引用返信 編集キー/
■93938 / inTopicNo.2)  Re[1]: Editボックスに簡体字をセットする方法
□投稿者/ 魔界の仮面弁士 (2567回)-(2020/02/23(Sun) 15:13:59)
No93935 (山猿 さん) に返信
> &#36213;治&#21195;→?治?
Shift_JIS で扱える範囲の文字なら化けないので、
"趙治勳" もしくは
"趙治勲" で代用するか、もしくは
Unicode 版の API に切り替えるかの二択でしょう。

> 'utf-8文字
> Dim sb = New StringBuilder("", 256)
StringBuilder で保持されるデータは、UTF-8 ではなく UTF-16 ですね。
といっても、String や StringBuilder 自体には、Encoding という概念はないですけれど。

> SendMessageStr(hwnd, WM_SETTEXT, Len(sb.ToString), sb)
WM_SETTEXT メッセージの WPARAM は、文字列長を指定する場所ではないですよ?


>     	Declare Function SendMessageStr Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal MSG As Integer, 
> 		ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As Integer

データ型がいろいろ間違っていますね…。下記だとどうですか?

Private Declare Auto Function SendMessageStr Lib "user32" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr


> 適切な対処方法を
一番の問題は Alias 句。
Alias "〜〜A" は、ANSI バージョンの意味です。日本語環境なら Shift_JIS 専用になります。
Alias "〜〜W" の Wide バージョン(Unicode 版)を呼び出すようにしましょう。


歴史的な事情から、インターネット上に古くからあるサンプルは、〜A 系主体のコードで溢れていますが、
Win9x 系の OS が駆逐された現在において、〜〜A 系 API を呼び出すメリットは皆無といえます。
この API に限らず、基本的には 〜〜W 系を呼び出すことが望ましいです。下記も参照してみてください。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html


実験用サンプル


Imports System.Text
Public Class Form1
    'ANSI / Wide それぞれのいろいろな宣言例
    Private Const WM_SETTEXT As Integer = &HC
    'Private Declare Ansi Function SendMessageA Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    'Private Declare Unicode Function SendMessageW Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    'Private Declare Auto Function SendMessageStr Lib "user32" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
    Private Declare Ansi Function SendMessageA Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
    Private Declare Unicode Function SendMessageW Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '掲示板投稿時の文字化けを避けるため、ChrW 表記にしています
        '上から、英語、簡体字中国語、繁体字中国語、日本語、韓国語
        Dim values() As String = {
            "Cho Chikun",
            ChrW(&H8D75) & ChrW(&H6CBB) & ChrW(&H52CB),
            ChrW(&H8D99) & ChrW(&H6CBB) & ChrW(&H52F3),
            ChrW(&H8D99) & ChrW(&H6CBB) & ChrW(&H52F2),
            ChrW(&HC870) & ChrW(&HCE58) & ChrW(&HD6C8)
        }
        Dim boxes(,) As TextBox = {
            {TextBox1, TextBox6},
            {TextBox2, TextBox7},
            {TextBox3, TextBox8},
            {TextBox4, TextBox9},
            {TextBox5, TextBox10}
        }

        '比較のため、A 系と W 系の両方を呼び比べています
        For n = 0 To 4
            Dim sb As New StringBuilder(values(n))
            SendMessageW(boxes(n, 0).Handle, WM_SETTEXT, IntPtr.Zero, sb)
            SendMessageA(boxes(n, 1).Handle, WM_SETTEXT, IntPtr.Zero, sb)
        Next
    End Sub
End Class

引用返信 編集キー/
■93942 / inTopicNo.3)  Re[2]: Editボックスに簡体字をセットする方法
□投稿者/ 山猿 (3回)-(2020/02/23(Sun) 22:42:02)
No93938 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さま。
ご回答ありがとうございます。
何年(何十年?)も前より、あなた様のご意見、ご投稿、大変有効に活用させて頂いております。
まことにありがとうございます。m(_ _)m

さて、今回の中国簡体字の件、訳あってどうしても簡体字で入力したく思っております。

訳とは:
棋士名一覧(もちろん囲碁棋士)を外部テキストで用意し、それらをリストボックスに配置し、選択式にて、某囲碁ソフト(可愛らしい狐さんのあれ)の検索蘭に投げ込んで、棋士検索をしようと思っての事なのでした。
なので、棋士名は、例えば「趙治勲」さんは、どうしても「&#36213;治&#21195;」さんでないとダメだったんです。

そんな訳あっての投稿なので、実際はIE対象ではありませんでした。ご容赦。
色々試してみたんですが、どうしても「?地獄」から抜け出られませんでした。

で、ご教示い頂いた内容を参考に、以下の様にしましたところ、


'ルートパステキスト(パネル)枠に保存先を求める
hwndsave = FindChildWindow(hwndConside, 0, 0, 0, 0, 0, "", 0, "Edit", 255, po) ← 対処のハンドル検索用の自作関数

Dim values As String = ""
For i = 1 To Len(selectplayer) ← selectplayerに棋士名が入っている("&#36213;治&#21195;"、或いは"於之&#33721;"等)
values = values & ChrW(AscW(Mid(selectplayer, i, 1)))
Next
Dim sb As New StringBuilder(values)
SendMessageW(hwndsave, WM_SETTEXT, IntPtr.Zero, sb)


目出度く解決に至りました。
大変ありがとうございました。

解決済み
引用返信 編集キー/
■93944 / inTopicNo.4)  Re[3]: Editボックスに簡体字をセットする方法
□投稿者/ 山猿 (4回)-(2020/02/23(Sun) 23:18:35)
No93942 (山猿 さん) に返信

っちゅうか、単に


'ルートパステキスト(パネル)枠に保存先を求める
hwndsave = FindChildWindow(hwndConside, 0, 0, 0, 0, 0, "", 0, "Edit", 255, po) ← 対処のハンドル検索用の自作関数

Dim sb As New StringBuilder(selectplayer)
SendMessageW(hwndsave, WM_SETTEXT, IntPtr.Zero, sb)


で良かったんですね。( ;∀;)
引用返信 編集キー/
■93950 / inTopicNo.5)  Re[4]: Editボックスに簡体字をセットする方法
□投稿者/ 魔界の仮面弁士 (2570回)-(2020/02/25(Tue) 11:34:19)
No93944 (山猿 さん) に返信
> Dim sb As New StringBuilder(selectplayer)
> SendMessageW(hwndsave, WM_SETTEXT, IntPtr.Zero, sb)
> で良かったんですね。( ;∀;)

入力引数なので、As StringBuilder ではなく
As String のまま渡すこともできますね。

ただし String にせよ StringBuilder によせ、ANSI / Unicode の
いずれの文字列で渡されるのかは、意識しておいた方が良いでしょう。
(未指定の場合は、確か ANSI が優先されたはず)

宣言は DllImport の場合と Declare の場合で記述が若干異なりますが、
Declare の場合は、前回紹介した URL でいうところの AutoLPTStr パターンで
実装すると、ANSI / Unicode 両対応の汎用実装にできます。
引用返信 編集キー/
■94003 / inTopicNo.6)  Re[5]: Editボックスに簡体字をセットする方法
□投稿者/ 山猿 (5回)-(2020/03/02(Mon) 11:22:35)
魔界の仮面弁士さま。
ご回答ありがとうございます。
返信遅くなり申し訳ありませんでした。

まことにありがとうございます。m(_ _)m

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ