- PR -

C#のWindowsFormクラスをAPI経由で呼び出す方法

投稿者投稿内容
Chihane
会議室デビュー日: 2007/06/19
投稿数: 6
投稿日時: 2007-06-19 09:45
はじめまして。初投稿させていただきます。
プログラム開発初心者なので、言葉でうまく説明できるか不安ですが、
よろしくお願いいたします。

開発環境はVC#2005です。

VC#でWindowsFormを作成する場合、
通常はフォームクラスを作成して、
インスタンスを作成してShowで表示をすると思います。

知りたい内容は、
こうして作成したフォームクラスをそのままWin32API経由で作成する方法です。


利用中のソフトで使用する関数の一つに、操作対象のコンポーネントのハンドルを指定するものがあるのですが、
そのフォームはAPIで作成されていないと認識されない様子です。※リファレンスにも記述されていました。

(フォームを子画面化するときにMdiParentプロパティでは駄目だったものが、
APIのSetParentを利用したところうまくいきました。)


どこかのサイトで、
.Netのフォームクラスでは、WindowsAPI関数と1対1対応になるような関数を利用できるが、
WindowsAPIを利用しているわけではない
というような記述を目にしました。

このことを踏まえて、やはり通常のやり方ではうまくいかないのではないかと考えています。



1からAPIでフォームを作成する手もあるのかも知れませんが、だいぶ手間がかかってしまいそうなので躊躇しています。


VC#のデザイナを利用して作成したフォームをAPI経由で作成・表示させる方法があればご伝授ください。
よろしくお願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-06-19 13:02
諸農です。

引用:

利用中のソフトで使用する関数の一つに、操作対象のコンポーネントのハンドルを指定するものがあるのですが、
そのフォームはAPIで作成されていないと認識されない様子です。※リファレンスにも記述されていました。



WindowsAPIで作成されたウィンドウでなければ操作できないとのことですが、なんという名前のWindowsAPIでウィンドウを作成するのでしょうか?それはC#プログラムの中で呼び出すのですか?それともC#プログラムとは全く違う外部のプログラムですか?

また、利用中のソフトが使用する関数に引き渡すハンドルですが、インスタンス化したフォームクラスのハンドル(Form.Handle/Controlクラスからの継承(Control.Handle))ではダメなのでしょうか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Chihane
会議室デビュー日: 2007/06/19
投稿数: 6
投稿日時: 2007-06-19 16:18
レスポンス、ありがとうございます。

ソフトのリファレンスでは、
 「このウィンドウはWindows API関数により作成されていることが必要です。」
 原文:This window must have been created with the Windows API functions.
とだけ書かれています。

ソフトウェア環境の仕様ではC++.Net、VB.Netがサポートされていますが、C#は実のところサポート外言語です…
ただ、VBの場合でも同様の問題が起こっているようです。
メーカーにも質問を出しているのですが、今はまだ解決に結びつく解答が得られていません。


上記はuser32.dllを呼び出して試したものです。
外部のプログラムではなくC#で呼び出します。

Control.Handleを試したところ、エラーは出ないのですが処理が行われませんでした。
ハンドルとフォームが一致していないような印象です。
しかしこのとき、ウィンドウのリサイズをかけると一時的に処理が行われました。
このことから、Windows自身のイベントを通したことで(OnPaintですか?)、何か効果が現れたのではないかと考えました。

user32.dllのSetParentで処理が実行されたので、勝手にWin32 APIならば良いのかと目星をつけました。


SetParentでもなんとか処理は実現できそうなのですが、何度もSetParentを実行する必要が生じて不便です。
フォームを生成する段階からAPIを利用できないかと模索中です。
VC#のデザイナで作成したフォームクラスを何らかの方法で変換して(?)、CreateWindowのような関数でフォームを作成できないものでしょうか?
Chihane
会議室デビュー日: 2007/06/19
投稿数: 6
投稿日時: 2007-06-19 16:27
引用:

Jubeiさんの書き込み (2007-06-19 13:02) より:

また、利用中のソフトが使用する関数に引き渡すハンドルですが、インスタンス化したフォームクラスのハンドル(Form.Handle/Controlクラスからの継承(Control.Handle))ではダメなのでしょうか?




すみません。言葉足らずだったので、補足します。
ソフトの関数に引き渡すハンドルはControl.Handleです。

ただ、通常方法でインスタンスを作成した場合だと、この方法で関数の処理が行われませんでした。(実行はされているようです)

フォームの生成の段階が問題なのではないか、と思っているところです。

(何分、初心者ですので、この勘も頼りになりませんが)


よろしくお願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-06-19 22:24
諸農です。

Control.CreateControl メソッドかまたはControl.CreateHandle メソッドはどうでしょうか?
一応注意事項にも目を通してくださいませ。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-06-20 09:24
諸農です。

追加のコメントとなって申し訳ないのですが。

引用:

ソフトのリファレンスでは、
 「このウィンドウはWindows API関数により作成されていることが必要です。」
 原文:This window must have been created with the Windows API functions.
とだけ書かれています。



このソフトは何をするものなんでしょうか(^^;)
.NET(C#)プログラムに組み込んで何かをするんでしょうか?
それとも外部から.NETプログラムで作成されたWindowsFormアプリケーションに何か作用を与えるものでしょうか?
その作用というものは、C#プログラミングでは実現不可能なものなのでしょうか?
そのソフト(コンポーネント?)を.NET(C#)プログラム内部で利用するのであれば、C#で実現可能かどうかなのかも検討視野に入れてみてはいかがでしょうか。

引用:

user32.dllのSetParentで処理が実行されたので、勝手にWin32 APIならば良いのかと目星をつけました。


どういうタイミングでSetParentを呼んで、どのようにそのソフト(コンポーネント?)を使ったのかが判らないので何とも言えないですね。


引用:

フォームを生成する段階からAPIを利用できないかと模索中です。
VC#のデザイナで作成したフォームクラスを何らかの方法で変換して(?)、CreateWindowのような関数でフォームを作成できないものでしょうか?



であれば、最初からC/C++で作ってみてはいかがでしょうか、と言うことになると思います(^^;)
無理に.NETでアプリケーションを作成する必要がないのであれば、ですが。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Chihane
会議室デビュー日: 2007/06/19
投稿数: 6
投稿日時: 2007-06-20 11:31
引用:

Jubeiさんの書き込み (2007-06-19 22:24) より:

Control.CreateControl メソッドかまたはControl.CreateHandle メソッドはどうでしょうか?
一応注意事項にも目を通してくださいませ。



ありがとうございます。こういう関数もあったのですね。知りませんでした。
すぐにハンドルが必要な場合… という点で、いつならば作成されているのでしょうか?
新たにちょっとした疑問も湧きました。 .Netは奥が深いです。

結局、Control.CreateControl でもうまくいきませんでした。
当面はSetParentで可能な範囲で凌ごうと思っています。
SetParentは画面が生成されている状態で、ハンドルを使用する前に入れました。

引用:

このソフトは何をするものなんでしょうか(^^;)
.NET(C#)プログラムに組み込んで何かをするんでしょうか?
それとも外部から.NETプログラムで作成されたWindowsFormアプリケーションに何か作用を与えるものでしょうか?
その作用というものは、C#プログラミングでは実現不可能なものなのでしょうか?
そのソフト(コンポーネント?)を.NET(C#)プログラム内部で利用するのであれば、C#で実現可能かどうかなのかも検討視野に入れてみてはいかがでしょうか。



このソフトは画像ボードのライブラリソフトです。
プログラム開発を始めたばかりで、あまり実態を理解できていないのですが… (これが大きな問題かもしれません)

作用の実現にはDirectXを利用することもできるようなのですが、不勉強でなかなか手を出せないため、現状の手法から力ずくで実現させようと思っている次第です。。。


まずは状況を言葉で説明できるようになりたいと痛感しました。
諸農様、勉強になりました。ありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-06-20 13:28
引用:

すぐにハンドルが必要な場合… という点で、いつならば作成されているのでしょうか?



普通のフォームやモードレスダイアログなら Show() した直後で、当のフォームやモードレスダイアログにしてみれば、Load イベント受信直前です。

引用:

.Netは奥が深いです。



この場合は .NET よりはむしろ Widnows の都合です。

.NET のフォームやらダイアログやらコントロールなんてものは、所詮 Windows の各種ウィンドウ/コントロールを .NET のクラスでカプセルしたものでしか。

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