tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルWndProc
記事No10574
投稿日: 2011/08/20(Sat) 14:50
投稿者nobu
こんにちは。お世話になります。

1.
下記の様なコードにて外部機器からの情報を受け取り Form1 上の Label に表示しています。
この間にも Form1 上の TextBox1 に文字を入力したいのですが、入力できません。
Me.KeyPreview = True はLoad 時に書いています。
TextBox1.Focus() を書いてもカーソルがTextBox1にあるだけで入力できません。
Timer2 が動いていない(外部機器からの情報を受け取っていない)時は
TextBox1 に文字を入力出来ます。

2.
Form1 終了時に WndProc を開放するにはどうすればよいでしょうか。

対応策をご指導願えれば幸いです。


    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

           ' cds に値をセットしてから

            Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)

            If Not Hwnd2.Equals(IntPtr.Zero) Then
                SetForegroundWindow(Hwnd2)
            End If

    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        If m.Msg = WM_COPYDATA Then
            Dim cds As COPYDATASTRUCT
            cds = CType(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
            tmp_thw = Marshal.PtrToStringAnsi(cds.lpData)
        Else
            MyBase.WndProc(m)
        End If

    End Sub

[ツリー表示へ]
タイトルRe: WndProc
記事No10575
投稿日: 2011/08/20(Sat) 14:58
投稿者nobu
こんにちは。お世話になります。
WinXp VB2010  Express  いままではVB6でしたが、つい最近VB2010.

(修正がエラーで上手く出来なかったので二重投稿になってしまった)


1.
下記の様なコードにて外部機器からの情報を受け取り Form1 上の Label に表示しています。
この間にも Form1 上の TextBox1 に文字を入力したいのですが、入力できません。
Me.KeyPreview = True はLoad 時に書いています。
TextBox1.Focus() を書いてもカーソルがTextBox1にあるだけで入力できません。
Timer2 が動いていない(外部機器からの情報を受け取っていない)時は
TextBox1 に文字を入力出来ます。

2.
Form1 終了時に WndProc を開放するにはどうすればよいでしょうか。

対応策をご指導願えれば幸いです。


     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

            ' cds に値をセットしてから

             Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)

             If Not Hwnd2.Equals(IntPtr.Zero) Then
                 SetForegroundWindow(Hwnd2)
             End If

     End Sub

     Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

         If m.Msg = WM_COPYDATA Then
             Dim cds As COPYDATASTRUCT
             cds = CType(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
             tmp_thw = Marshal.PtrToStringAnsi(cds.lpData)
         Else
             MyBase.WndProc(m)
         End If

     End Sub

[ツリー表示へ]
タイトルRe^2: WndProc
記事No10576
投稿日: 2011/08/20(Sat) 22:38
投稿者Hongliang
> Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
このHwnd1というのは自分自身のフォームですか?
同一プロセス間でわざわざ WM_COPYDATA を使っている?
のであれば、その意図をお聞かせください。一般に WM_COPYDATA はプロセス間通信に使用する物なので。
同一プロセスなら、単純に Label の Text に代入するだけでしょう。
それとも、この Timer2 と WndProc を実行しているのは別々のプロセスなのでしょうか?

あと、WndProc は解放とかそういう類の物ではありませんが、何故そういう質問をするに至ったのでしょうか?

[ツリー表示へ]
タイトルRe^3: WndProc
記事No10577
投稿日: 2011/08/21(Sun) 04:21
投稿者nobu
回答ありがとうございます。説明に不足があったようで失礼しました。

1.外部機器(無線機)からの情報を取得するソフトAがあります。(フリーソフト)

2.このソフトで取得されている情報を、今回のソフトBで取得したいのです。
  Timer2 で情報の要求をしている。機種により一定間隔での要求が必要あり。
  今回のソフトBで直接取得すれば良いのでしょうが、機器により
  情報を取得するコードが異なるので、既存のソフトAで取得された情報を利用したい。

> このHwnd1というのは自分自身のフォームですか?

ソフトAです。

> WndProc は解放とかそういう類の物ではありませんが、何故そういう質問をするに至ったのでしょうか?

VB6の別ソフトでは、開始時の処理と別に、終了時の後始末処理がありましたので
そのままにしておいてはいけないのかと思った次第です。
VB6の別ソフトのコードの利用も考えたのですがVB6の別ソフトを
VB6からVB2008へのアップグレードツールで変換すると
変換時のエラーが出ました。(結構多いので)
VB2008で動くサンプルがあったので今回は、こちらを利用しようとしています。

[ツリー表示へ]