- PR -

.Netのハンドルについて

1
投稿者投稿内容
nickee
会議室デビュー日: 2005/11/13
投稿数: 4
投稿日時: 2005-11-13 21:58

初歩的質問で申し訳ないですが、ご教授ください。

やりたいこと・・・フォームを、常に手前に表示する。

VB6.0では、
Dim HWND
Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = 2
Public Const SWP_NOSIZE = 1

HWND = Form1.Handle()
SetWindowPos(HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)

で、実現できるようですが、

.Netでは、Form1のメソッドにHandleが存在しないようです。
また、Form1をMeに変更すると、Handleが存在するのですが、ビルドすると、SetWindowPosにて、次のエラーメッセージが出てしまい、うまくいきません。ちなみに変数宣言では、Dim HWND as Objectに変更しています。

エラー:追加情報:型'IntPtr'から型'Long'へのキャストが有効ではありません。


どのように解決したらよいかわかりません。よろしくお願いいたします。

Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-11-13 22:09
VB.NETではVB6までからは型が大幅に変更されています。
例えばLongはIntegerに、IntegerはShortになりました。
さらに、ハンドルやポインタは今までLongで表現していましたがIntPtrで表現するようになっています。
そのままVB6のコードをコピーするだけではなかなかうまくいかないでしょう。

で、それとは全く関係なく、フォームを常に手前に表示するのには、フォームのTopMostプロパティをTrueにするだけで済みます。
nickee
会議室デビュー日: 2005/11/13
投稿数: 4
投稿日時: 2005-11-13 23:20
ありがとうございます。
簡単に問題が解決しました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-13 23:53
問題自体の回答はとっくについているので、Hongliang さんの前半部分に補足します。

引用:

nickeeさんの書き込み (2005-11-13 21:58) より:

VB6.0では、
(snip)
HWND = Form1.Handle()
SetWindowPos(HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)

で、実現できるようですが、


Form1.hWnd の間違いですよね。
それと、HWND と名乗っている変数は Long で定義しても問題ありません。

引用:

.Netでは、Form1のメソッドにHandleが存在しないようです。


メソッドではなくプロパティですね。
インスタンス化さえされていれば、Form1.Handle でいけるはずです。

引用:

また、Form1をMeに変更すると、Handleが存在するのですが、


これが何故に「存在する」のかを考えて頂けると嬉しいですね。
上記で述べた内容がまさにこれにあたります。
これは、Me がインスタンス化されたフォームだからですね。

引用:

エラー:追加情報:型'IntPtr'から型'Long'へのキャストが有効ではありません。


Handle プロパティは元より System.IntPtr 型ですから Long にする必要はありません。

  VB6 および .NET での参考 URL
  フォームを常に最前面に表示する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)