タイトル : Re: SetWindowLongの動作 投稿日 : 2017/06/20(Tue) 21:28 投稿者 : 魔界の仮面弁士
> プログラムをVB.NET(VB2005)に変換したのですが、 このタイミングで 2005 とは…大変ですね。 ところで、提示頂いたコードは修正すべき箇所が多すぎるので、 変換前の VB6 コードを見せてもらえないでしょうか。 間違ったコードを手直しするよりは、そちらの方が手っ取り早そうで…。 > ●フリガナ取得部分 入力されたフリガナの取得を行いたいだけであれば、 Microsoft Visual Studio International Feature Pack 2.0 の Yomigana Framework を利用する方法もあります。 https://www.microsoft.com/ja-jp/download/details.aspx?id=18970 https://www.microsoft.com/ja-jp/download/details.aspx?id=15251 エクスプローラーで "C:\Program Files (x86)\Microsoft Visual Studio International Feature Pack 2.0\YomiganaFramework\YomiganaTextBox.dll" を「コピー」してから、Visual Studio で Form1 のデザイナを開き、 ツールボックス上で「貼り付け」すると、ツールボックス上に YomiganaTextBox が追加されます。 (Microsoft.International.Windows.Forms.YomiganaTextBox クラス) Form1 上に YomiganaTextBox と TextBox を貼り付けてから、 YomiganaTextBox1 の BindingControl プロパティに TextBox1 を割り当てれば完成。 YomiganaTextBox1 に漢字入力すると、TextBox1 にカナが入ります。 ただし、漢字入力後に編集した場合や、クリップボード経由での入力に追従できないなど 幾許かの制限があります。また、実行環境が 64bit 環境である場合には、 プログラムを x86 ビルドでコンパイルしておく必要があります > VB6のときには問題なく動作していたのが、VB.NETだと途中でエラーになってしまいます。 Short(16bit)、Integer(32bit)、Long(64bit)、IntPtr(32/64) の使い分けが出鱈目だからでしょうね…。 少なくとも、Function SetWindowLong2 の戻り値を As Short で宣言しておきながら、 それを m_lpOrg As Long に代入している時点で整合性が取れていません。 SetWindowsLong では、何故か nIndex が Short 型で宣言されてしまっていますし(本来は32bit整数型)、 コールバックデリゲートについても、 × Public Delegate Function WindowProcDelegate(ByVal hwnd As IntPtr, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ○ Public Delegate Function WindowProcDelegate(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr となるべきでしょう。もちろん、AddressOf される Public Function pWindowProc の引数・戻り値も同様です。 EndEdit 内で呼び出しているハンドルの取得も、m_txtSrc.hwnd ではなく、m_txtSrc.Handle でしょうし、 データ型も m_txtSrc As Object ではなく m_txtSrc As TextBox が適当かと思います。 それに、そもそも .NET では、サブクラス化のために GWL_WNDPROC を呼ぶ必要がありません。 TextBox を継承したクラスを用意すれば、サブクラス化せずとも WndProc メソッドを簡単かつ安全に処理できる仕組みが用意されていますし、 仮に TextBox を継承できない理由があったのだとしても、その場合は NativeWindow クラスを通じて WndProc を処理することができるようになっています。 他にも、 ・オーバーロードがサポートされるので、引数定義の異なる API を呼ぶ際に、わざわざ SetWindowLong2 のような別名を付与する必要は無い。 ・Windows 9x 系をサポートするのでなければ、〜A 系 API ではなく、〜W 系 API を使うべき。 ・VB6 と違って、AddressOf の対象となるプロシージャを Module 上に配置する必要は無い。 などなど…。 |