3

Control.FromHandleというメソッドを見ましたが、これはあなたにアクセスを与えるはずです。今、私はこのコードを使用してそれを試してみたかった

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    // Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

    [DllImport("user32.dll")]
    private static extern IntPtr GetDC(IntPtr hwnd);
    [DllImport("user32.dll")]
    private static extern bool ReleaseDC(IntPtr hwnd, IntPtr hdc);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IntPtr ptr = FindWindowByCaption(IntPtr.Zero, "Download");
        Control f = Control.FromHandle(ptr);
        f.Text = "Something";
    }

しかし、それは明らかに機能しません。ハンドルが正しいことを個人的にチェックしました...しかし、メソッドはnullコントロールを返します。説明はありますか?

4

3 に答える 3

4

このメソッドは、渡したハンドルが実際にControlアプリケーションにある場合にのみ機能します。

于 2010-02-20T21:35:43.653 に答える
2

特定のケースでは、テキストを設定したいだけなので、user32.dll からSetWindowTextを呼び出します。

于 2010-02-20T21:53:16.700 に答える
0

この答えを見つけて、なぜこの動作が当てはまるのか疑問に思った他の誰かにとって、この投稿http://www.codeguru.com/forum/showthread.php?t=443191は特に啓発的です。具体的には「マッドハッター」からの最後の投稿です。

リフレクターの Control.FromHandle で何が起こっているかを調べるだけで、.net の世界にウィンドウが追加されると、読み込まれたハンドルのテーブルが格納されるように見えます。ハンドルを渡すと問題が発生します。表には記載されていません。.net アプリ内からウィンドウを作成するときに使用されるすべてのサブシステムを介してウィンドウを登録できるようにするハックがあるかもしれませんが、Windows API を介して直接必要な機能をラップする方が適切で一貫性があるでしょう。次に、 Control.FromHandle をハックして、他のプロセスのウィンドウにアクセス/操作できるようにします。

あなたの質問をさらに読むと、自動化を試みているか、少なくとも何らかの方法でウィンドウを操作しようとしているようです。SourceForge のManaged Windows APIプロジェクトを参照することをお勧めします。それはかなりよく書かれており、あなたが説明している目的のためにそれを使用しました.

于 2011-03-07T22:08:59.607 に答える