none
ウィンドウの位置について教えてください。 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。


    ディスプレイの表面側から奥に向かって、
    -----表面-------
    ・タスクバー
    ・通常のウィンドウ
    ・アイコン
    ・背景画面
    -----奥---------
    というようにウィンドウを配置しているとします。

    このとき、
    -----表面-------
    ・タスクバー
    <ここ>らへん
    ・通常のウィンドウ
    ・アイコン
    ・背景画面
    -----奥---------
    に表示するには、TopMostプロパティを設定すればよいです。

    -----表面-------
    ・タスクバー
    ・通常のウィンドウ
    <ここ>らへん
    ・アイコン
    ・背景画面
    -----奥---------
    に表示するには、
    http://jeanne.wankuma.com/tips/csharp/form/bottommost.html
    で可能です。

    では、
    -----表面-------
    ・タスクバー
    ・通常のウィンドウ
    ・アイコン
    <ここ>らへん
    ・背景画面
    -----奥---------
    に表示するには、どうしたらよいでしょう?

    2011年1月21日 10:40

回答

  • SetParent 関数の第一引数にウィンドウのハンドルを指定するのでは?

    http://msdn.microsoft.com/ja-jp/library/cc411061.aspx

    ですので ???? としているところに WPF のウィンドウのハンドルを指定

    第二引数には FindWindow 関数で取得したハンドルを指定すればよろしいのではないでしょうか。

    特に System.Windows.Forms 名前空間を使用する必要はないと思いますよ。

    ちなみに WPF のウィンドウのハンドルは WindowInteropHelper クラスを使用しても取得できると思います。そのハンドルを使用して HwndSource クラスも取得できるので、どちらでも同じハンドルが取得されると思います(試してませんが)。


    ダッチ http://youryella.wankuma.com/
    • 回答としてマーク d-kot 2011年1月30日 11:02
    2011年1月30日 0:56

すべての返信

  • アイコンというのはデスクトップのアイコンで、背景画面というのはデスクトップの事でしょうか?

    アイコンとデスクトップは一体なので、その間というのはおそらく無理ですよ。それはウィンドウとそれに表示されているListViewというだけなので。

    2011年1月21日 11:06
  • T-Yokooさん、早速ありがとうございます。
    なるほど。
    はい。アイコンはデスクトップのアイコンで、背景画面は、デスクトップの意味で使いました。
    で、そうですか。そのあいだは無理ですか…。
    とすると、そのあいだに表示するには、できるかどうかは別として、たとえば、
    (1)デスクトップのアイコンファイルを取得する。
    string() files = Directory.GetFiles(desktop, "*");
    (2)デスクトップのアイコンの位置を取得する。
    たとえば…、
    すべてのウィンドウを隠して、デスクトップのみを画像としてキャプチャーする。
    そのfilesのiconを画像として取得する。
    iconをbmpに変換して、うえから順番に比較して、同じものがあったらそれの位置を記録する。
    (3)デスクトップのうえに
    http://jeanne.wankuma.com/tips/csharp/form/bottommost.html
    の方法でウィンドウを描写し、そのなかにアイコンを自分で描写する。
    (4)アイコンをダブルクリックしたときのイベントを記述する。これは簡単そう。
    (5)アイコンを移動したときの描写を記述し、もし移動したら、デスクトップのアイコンを移動する。これはちょっと想像もつかない。
    とかって処理をすればよいってことですね。

    (2)は画像の比較で、結構時間を食いそうです。
    すべてのウィンドウを隠す方法もまだやったことがないから…。
    icon2bmpってのも、まだやったことないな…。
    う~む。
    (2)のデスクトップのアイコンの位置って、どこかで簡単に取れたりしないですか?

    2011年1月21日 13:19
  • なぜそういったことをやりたいのでしょうか。
    デスクトップを覆い隠しても、Windows キー + D キーで表示できますし、苦労する割にはどういう狙いがあるのかなと気になりました。

    OS によるとは思いますが、ListView だったような気がするので、ウィンドウメッセージとか駆使すれば場所はとれるかもしれません。
    ただし、XP で通用する方法が Vista や 7 では通じないと言うことは十分あり得るので、広く配布するアプリには向かない気がしています。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月21日 14:08
    モデレータ
  • う~ん。なぜといわれても、たとえば動く背景を作りたいとか、背景を自由にコントロールしたいとか、と漠然と思っているところで、やりたいからやりたいとしか答えようがないです。
    おっしゃるとおりで、苦労するわりに益は少ない気もしますし、
    XPでは使えても7とかではだめなことは容易に想像できます。

    Windows+Dで表示できちゃうのですか。それは知らなかったです。
    とはいえ、広く配布するかどうかはあまり気にしていなくて、基本的にはやってみたいからやってみたいとしかいえないです。

    ときどきそういう問いを問われている気がしますが、逆に、なんでやりたいことができないんだろうと思うことのほうがわたしなんかだと多いんです。
    もちろん、やりたいことをできない理由の大半は、わたしのプログラミングの能力がそうとうに低いということもあると思いますが、それにしても、いろんなことの制約が多すぎる気がしています。だから、逆にいうと、なんでそれをしたくならないんだろう、というほうがわたしにとっては不思議です。
    どうしてデスクトップのアイコンとデスクトップのあいだに、自分で自由にできるデスクトップを置きたくならないんですか?
    それが、すごくてまのかかる作業だとしたら、どうしてそんな手間のかかるような環境になっているんですか?
    もっと自由でいい気がするんですよ。

    2011年1月21日 14:32
  • ときどきそういう問いを問われている気がしますが、逆に、なんでやりたいことができないんだろうと思うことのほうがわたしなんかだと多いんです。

    「なぜそういったことがしたいのか」という問いをする目的としては、今のアプローチが最適かどうか疑うためです。
    やりたいことを聞き出すことによって、簡単なアプローチ、実現性の高いアプローチなどを提案できる可能性もあるからです。

    もちろん、やりたいことをできない理由の大半は、わたしのプログラミングの能力がそうとうに低いということもあると思いますが、それにしても、いろんなことの制約が多すぎる気がしています。だから、逆にいうと、なんでそれをしたくならないんだろう、というほうがわたしにとっては不思議です。

    長く Windows でのプログラミングをやっていると、多分こうなっているだろう、このようになっているから難しいだろうと言うのが推測できることがあります。
    いろいろと経験してきたことから、可能性の低いことにはなるべく手を出さないというように、チャレンジ精神を抑えてしまっているかもしれませんね。

    どうしてデスクトップのアイコンとデスクトップのあいだに、自分で自由にできるデスクトップを置きたくならないんですか?

    やりたいと思わないからとしか言えません。
    その間に置くことによって、便利になるソフトウェアを思いついていないからでしょうか。
    あとは、普段からウィンドウが多くなり、デスクトップってあまり見えないので、それを強化する必要性を感じていないからとも言えます。

    # 自分で自由にデスクトップを作りたいなら、タスクマネージャー から Explorer を終了させる。
    # そして、すべて自分で実現すると言うことも考えられますけど、そこまでハードル高いことをやりたいわけではないのですよね?

    それが、すごくてまのかかる作業だとしたら、どうしてそんな手間のかかるような環境になっているんですか?
    もっと自由でいい気がするんですよ。

    ユーザーの需要が大きくないならそれを叶えるための労力をかけず、目的を満たす最小の工数で実現できる設計を採用するのは合理的な考えです。
    デスクトップとアイコンの間にそういった要素を作ろうとする人が相対的に少ない、あるいはメーカーにとって取るに足らないと判断していれば、別に自由にするために力を注ぐ必要がないと言えます。

    Microsoft が今の設計を採用する実際の理由はわかりませんが。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月22日 1:03
    モデレータ
  • 否定の話ばかりではあれなので、思いついている、気にすべき観点を書き出します。

    ・ダブルクリックイベントだけで良いのか?
     デスクトップは右クリックでのメニュー、ドラッグ&ドロップでの範囲選択、ドラッグ&ドロップでの移動・コピー、ほかのウィンドウからのドロップの受け入れ、ほかのウィンドウへのドラッグなどをサポートします。
     また、選択された状態として青っぽくなります。

    ・デスクトップにあるアイコンを集める手法
     デスクトップは現在のユーザーのアイコンと、すべてのユーザーのアイコンが集められたものである。
     従って、その 2 箇所以上をカバーしなければならない。
     また、マイ コンピューターなどデスクトップの物理フォルダに存在しないアイコンが存在する。
     IShellFolder など、仮想フォルダーを扱える仕組みを検討するべき。

    ・壁紙の変更の検知


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月22日 1:09
    モデレータ
  • d-kot さん、こんにちはダッチです。

    私は d-kot さんの気持ちがよくわかります。
    プログラミングでいろいろとやってみたくなることが多々あります。
    例えば、デスクトップのアイコンを GIF アニメみたいに動かしてみたいとか思ったりします。

    d-kot さんが実現したいことについて「Fences」というアプリケーションが似ていると思いました。
    検索していただければ、どのようなソフトかわかると思います。
    デスクトップのアイコンを制御して自身のウィンドウの上に表示しています。

    どのようにして実現しているかは私にもわかりませんが、
    出来る可能性があるという希望があると思います。

    .NET Framework だけでは無理だと思いますので、Win 32 API など P/Invoke を使うことになると思います。
    フックしたりと、いろいろ内部の処理をいじくりまわしているんでしょうね。

    具体的な解決方法がなくてあれですが、
    解決の糸口になれば幸いです。

    ダッチ http://youryella.wankuma.com/
    2011年1月22日 2:12
  • Azuleanさん、ふふふ、鋭いですね。じつにおもしろい。
    聞かれたから答えますが、もちろん、ぜんぶを自分で実現したいのです。そんなの、いわずもがなじゃありませんか。
    2011年1月22日 2:54
  • なるほど。デスクトップを代替するものを全部作り上げてみることなんですね。

    軽く見てみましたが、C# からアイコンの座標を求めるといったことをするのはインターフェースを書き直しなどの手間が生じるかもしれません。

    Querying information from an Explorer window
    http://blogs.msdn.com/b/oldnewthing/archive/2004/07/20/188696.aspx
    IFolderView::GetItemPosition Method
    http://msdn.microsoft.com/en-us/library/bb775600(v=vs.85).aspx

    デスクトップも Explorer ですから、そのデスクトップを示す IFolderView を得ることができれば、GetItemPosition でアイテムの座標を得られる可能性です。(実験していません)
    これを使うには ITEMIDLIST が何か、Shell のインターフェースって何か、そもそも COM って何かとか前提知識がかなり求められることになります。

    # 単純に ListView と見なして座標を取得するアプローチは、そのアイテムが何か特定できないので検討から外しました。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月22日 3:34
    モデレータ
  • ダッチさん、こんにちは。
    おっしゃるとおりで、やってみたいことがたくさんです。
    Fencesというのがあるんですね。早速紹介ビデオを見てみました。
    たしかに、デスクトップにウィンドウを作って、その中でデスクトップを再現しているようにわたしにも見えます。
    やっている技術は垂涎ですね。やりたいことはだいぶ違うけど。
    情報ありがとうございます。

    このデスクトップとアイコンを置き換えるソフトですが、それを具体的にイメージして、すでにそのメリットを感じ始めています。まあとりあえずファーストバージョンは、作ってみようと思っています。たぶんデスクトップにおいて、デスクトップのアイコンを起動するくらいなら、1日くらいでできると思うので。

    ちなみに、余談ですが、ダッチさんのページを拝見して、おおお、おんなじものを作ってる~、と思いました。それで、わかっていただけるんでしょうかね。志向が似ていると。
    選択範囲をWeb検索とか。
    Mail Remoconとか。
    ワンタッチキーボードとか。

    ワンタッチキーボードですでに実現されていらっしゃるように思いますので、余談ついでにお伺いしようかな。
    先日、あるWebページを見ていて、そのページのテキストを保存するのに、Ctrl+A, Ctrl+CをCtrl+0に割り当てて連続して実行しようと、次のようなコードを書きました。

    //キーエミュレーションでコピー。2011/01/14(金)
    keybd_event(17, 0, 0, (UIntPtr)0);//Ctrlキーダウン
    KeyClick(65);//VK_Aキーセレクトオール。
    keybd_event(17, 0, 2, (UIntPtr)0);//Ctrlキーアップ
    keybd_event(17, 0, 0, (UIntPtr)0);//Ctrlキーダウン
    KeyClick(67);//VK_Cキーコピー。
    keybd_event(17, 0, 2, (UIntPtr)0);//Ctrlキーアップ

    private static void KeyClick(byte key){
     keybd_event(key, 0, 0, (UIntPtr)0);
     keybd_event(key, 0, 2, (UIntPtr)0);
    }

    (DllImport("user32.dll"))
    public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

    で、これでセレクトオールはできるのだけど、コピーできないんですが、なんででしょうね。
    ウエイトを入れてみたり、いろいろしてもだめで、とりあえず断念中なんですけど。

    2011年1月22日 3:42
  • Azuleanさん、ありがとうございます。
    いや、いますぐにはとても無理なので、とりあえず参考ということで。ありがとうございますです。
    ちなみにアプローチとしては、
    (1)取得できるデスクトップのファイルを取得する。
    string() files = Directory.GetFiles(desktop, "*");
    (2)デスクトップのうえに
    http://jeanne.wankuma.com/tips/csharp/form/bottommost.html
    の方法でウィンドウを描写し、そのなかに必要な情報を自分で描写する。
    (3)情報をダブルクリックしたときのイベントを記述する。これは簡単そう。
    くらいから初めてみようと思っています。
    2011年1月22日 3:47
  • > 余談ついでにお伺いしようかな。
    本題とズレますが、せっかくなので答えてみますね。

    keybd_event 関数は古い関数で最近の OS では SendInput 関数に代わっています。
    ただし 32 bit と 64 bit で定義を変更する必要があるのでその辺が難しいですが。

    それと「[Ctrl + 0」を入力した時にすでに Ctrl キーは押されていますので、Ctrl キーをアップさせるのが一番最初に必要だと思いますよ。
    ちなみに同じ処理をワンタッチキーボードでやってみたらコピーできました(よかった)。特にウェイトなどは使っていないはずです。

    > 例えば、デスクトップのアイコンを GIF アニメみたいに動かしてみたいとか思ったりします。
    これじゃなくて、デスクトップをウィンドウとして表示したいとか、デスクトップを一時的に最前面に表示したい (こういうソフトは見つかります) とかの方がイメージが近かったかも。

    ダッチ http://youryella.wankuma.com/
    2011年1月22日 4:19
  • ダッチさん、大ヒントありがとうございます。
    おっしゃるとおりで、最初にCtrlをアップさせたら、うまくできました!!!
    なるほど、気づかなかったです。感謝。
    むしろCtrlをアップしていないのに、セレクトオールだけうまくいっている理由がなぞですが。

    デスクトップに関しては、おっしゃるとおりで、いろいろな表現がある、ということかと思います。
    たぶん、それはWindowsの標準的なアプリケーションとか、業務用のアプリケーションとかをお仕事で作られていると、まあ業務用のアプリケーションのなかにもかなりWindows標準とはかけ離れているものもある気もしますが、そういう「違う」表現をすることに関心はわかないかもしれませんけど、わたしみたいに遊びであると、いろいろやってみたい、ということなんだろうな、という気がします。

    雑談ついでにもうひとつ。
    フッタに、署名とURLがついてますが、これ書き込みはどうやってなさっていらっしゃるんですか?
    手動?
    それとも、フッタつきで自動?
    あるいはフッタのついた文書を生成して半自動?

    2011年1月22日 7:21
  • 早速次のようにして試したところ、

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;

    namespace bottomdesktop
    {
        public partial class MainWindow : Window
        {
     // FindWindow 関数
     (DllImport("USER32.DLL", CharSet = CharSet.Auto))
     private static extern System.IntPtr FindWindow(
         string lpClassName,
         string lpWindowName
     );

     // SetParent 関数
     (DllImport("USER32.DLL", CharSet = CharSet.Auto))
     private static extern System.IntPtr SetParent(
         System.IntPtr hWndChild,
         System.IntPtr hWndNewParent
     );

            public MainWindow()
            {
                InitializeComponent();
     // Program Manager のハンドルを取得する
     System.IntPtr hProgramManagerHandle = FindWindow(null, "Program Manager");

     // 正しく取得できた場合は、Program Manager を親ウィンドウに設定する
     if (!hProgramManagerHandle.Equals(System.IntPtr.Zero))
      SetParent(this.Handle, hProgramManagerHandle);

     string wallpaperpath = "c:\wallpaper.jpg"
                this.BackgroundImage = Bitmap.FromFile(wallpaperpath);
            }
        }
    }

    'bottomdesktop.MainWindow' に 'BackgroundImage' の定義が含まれておらず、型 'bottomdesktop.MainWindow' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
    'bottomdesktop.MainWindow' に 'Handle' の定義が含まれておらず、型 'bottomdesktop.MainWindow' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
    名前 'Bitmap' は現在のコンテキスト内に存在しません。
    とエラーなのですが、それぞれどのように修正したらよいでしょう?

    2011年1月22日 8:06
  • とエラーなのですが、それぞれどのように修正したらよいでしょう?

    元のコードが Windows フォーム アプリケーション向けなのでしょう。
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.backgroundimage.aspx

    名前空間を見れば、WPF 向け(System.Windows.Controls)か、Windows フォーム アプリケーション向け(System.Windows.Forms)かは区別できると思います。
    もしくは、そのプロパティの名前で検索するか、Window と Form というクラス名の違いですね。

    WPF でどのように書くかは、WPF を使ってないので何とも言いかねます。
    WPF 対象のサンプルを探してみてください。

    # Windows フォーム アプリケーションと WPF アプリケーションはかなり違います。
    # 多くのサンプルは、Windows フォーム アプリケーション 向けであると思います。
    # ご自身で応用を利かすか、WPF に限定して調べるかが必要でしょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月22日 8:18
    モデレータ
  • のっけから、できない前提になっていますが、IE4 以降 (Win9x/Win2000/XP/Vista/7) なら、アクティブデスクトップオブジェクト(今はデスクトップ Web 項目?みたいな名前になってますね)が該当の位置にあるんじゃないですか?

    その場合、Web 技術を利用したコンテンツの表示になるので、HTML を書いて Windows Forms のオブジェクトを Object タグでホストしてあげればよいですね。(画面のプロパティから追加できるのが望ましいですが)

    環境ソフト(アクアリウムとか、モバイル機器だと地図とか)は、この位置に表示されるものが、過去も最近も見られますね。(個人的には、この位置に色々いれる場合には、フィードバックしないなら絵を差し込む方向が簡単じゃないかと思いますけど)

    2011年1月25日 4:59
  • K.Takaokaさん。
    え、できるんですか?
    書いてあることはよく理解できなかったのですが、アクティブデスクトップとかあるとは思っていたのですが、ひょっとしてそれってこと? ですよね。

    ただ、いちばんやりたいWPF版でHandleの処理で完全に行き詰まっていて、早4日。

    2011年1月26日 14:32
  • C# Handleで調べると、
    Handleは、IWin32Window.HandleまたはSystem.Windows.Forms.Control.Handleらしいです。
    そこで、System.Windows.Formsを参照設定で追加して、
    IWin32Window.Handle
    とすると、
    静的でないフィールド、メソッド、またはプロパティ 'System.Windows.Forms.IWin32Window.Handle.get' で、オブジェクト参照が必要です
    とエラーになっています。
    なんのオブジェクト参照が必要なのでしょう?

    http://www.weblio.jp/content/IWin32Window
    を見ると、
    名前空間: System.Windows.Forms
    アセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
    とある。
    System.Windows.Forms.dllはすでに参照しています。

    2011年1月29日 9:06
  • C# Handleで調べると、
    Handleは、IWin32Window.HandleまたはSystem.Windows.Forms.Control.Handleらしいです。

    ですから、それは Windows フォームアプリケーションでの解決方法であって、WPF ではありません。
    名前空間で識別するという一つのやり方を以前書いたと思いますが、System.Windows.Forms.Control となっていますよね?
    今のプロジェクトは WPF アプリケーションでしょうから、使えないと思ってください。

    WPF アプリケーションと Windows フォームアプリケーションは全く違うものです。
    ご自身が使っているプロジェクトの種類にあった解決方法を探してください。
    昔からある多くのサンプルは Windows フォームアプリケーション専用で、WPF で使えないことも多いと言うことを認識して、サンプルを探してください。

    http://www.weblio.jp/content/IWin32Window
    を見ると、
    名前空間: System.Windows.Forms
    アセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
    とある。
    System.Windows.Forms.dllはすでに参照しています。

    WPF アプリケーションでは、System.Windows.Forms 名前空間の要素は使えないと思ってください。

     

    探すのであれば、「C# WPF ウィンドウハンドル」というように、WPF を加えて検索するべきでしょう。
    http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&num=50&q=WPF+C%23+%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月29日 9:48
    モデレータ
  • HwndSource source = HwndSource.FromVisual(this) as HwndSource;
    IntPtr handle = source.Handle;

    SetParent(?????, handle);
    かも、という感じですが???をまだ見つけられません。

     

    Formのdllを参照してFormのコマンドをフルパスで指定すれば、WPFでも、Formのコマンドを使えると思うのは浅はかなんでしょうか。

    2011年1月29日 14:20
  • SetParent 関数の第一引数にウィンドウのハンドルを指定するのでは?

    http://msdn.microsoft.com/ja-jp/library/cc411061.aspx

    ですので ???? としているところに WPF のウィンドウのハンドルを指定

    第二引数には FindWindow 関数で取得したハンドルを指定すればよろしいのではないでしょうか。

    特に System.Windows.Forms 名前空間を使用する必要はないと思いますよ。

    ちなみに WPF のウィンドウのハンドルは WindowInteropHelper クラスを使用しても取得できると思います。そのハンドルを使用して HwndSource クラスも取得できるので、どちらでも同じハンドルが取得されると思います(試してませんが)。


    ダッチ http://youryella.wankuma.com/
    • 回答としてマーク d-kot 2011年1月30日 11:02
    2011年1月30日 0:56
  • Formのdllを参照してFormのコマンドをフルパスで指定すれば、WPFでも、Formのコマンドを使えると思うのは浅はかなんでしょうか。

    static とついている静的な要素は、そのクラスのインスタンスを生成しなくても利用できます。(これをフルパスで指定すればと書かれているのかもしれません)
    Handle プロパティは static がついておらず、静的な要素ではありません。
    従って、そのクラスのインスタンスに対してのみ利用可能です。
    (このあたりがわからない場合は、”クラス”について再度勉強してみてください)

    Form などのインスタンスを生成し、そのインスタンスに対して実行すればそのインスタンスのウィンドウハンドルが取れます。
    ただし、これは今使いたいとされている MainWindow のウィンドウハンドルと全く関係がありませんので、あえてインスタンスを作る必要性はありません。(というより、無意味なので使えない)

    WPF で作っている中で System.Windows.Forms 名前空間を使う必要性は通常ないはずです。
    全く別の名前、別の使い方になるかもしれませんが、WPF ならではの方法が存在することが多いと思いますので、WPF を使うのであれば、System.Windows.Forms 名前空間のことは忘れてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年1月30日 4:13
    モデレータ
  • ダッチさん、ありがとうございます。
    自分のWPFのウィンドウのウィンドウハンドルってことでしょうか。
    // Program Manager のハンドルを取得する
    System.IntPtr hProgramManagerHandle = FindWindow(null, "Program Manager");
    //自分のハンドルを取得する。
    System.IntPtr selfHandle = FindWindow(null, "WPFbottom");

    // 正しく取得できた場合は、Program Manager を親ウィンドウに設定する
    if (!hProgramManagerHandle.Equals(System.IntPtr.Zero))
     SetParent(selfHandle, hProgramManagerHandle);
    としてみました。
    が、自分のハンドルを取得できず。
    WPFbottomは、名前空間名で、プロジェクト名でもあるのですが、ハンドルを取得するときには、なにをキーワードにすればよいんでしょう?

    2011年1月30日 10:55
  • できました。ひょっとしてと思ったら、MainWindowでした。
    大感謝です。
    2011年1月30日 11:02
  • おっできましたか。

    WPF では Window (トップレベルのウィンドウ)以外、ウィンドウハンドルはありません。ここが Windows Forms と大きく違うところです。

    私が思っていたウィンドウのウィンドウハンドルの取得方法は次のコードでした。

    var wih = new WindowInteropHelper(this);

    // wih.Handle この Handle プロパティでウィンドウのウィンドウハンドルを取得します。

    var hs = HwndSource.FromHwnd(wih.Handle);

    // 取得したウィンドウハンドルから HwndSource を作成することもできます。

    このようにすれば Window の(今回は MainWindow)ハンドル取得には FindWindow は不要になりますよね。


    ダッチ http://youryella.wankuma.com/
    2011年1月30日 12:09