2017-07-05 12 views
0

javaw.exeプロセスに添付された特定のウィンドウのサイズと位置を取得しようとしています。GetWindowRectはNullReferenceExceptionを返します

悲しいことに、GetWindowRectは「NullReferenceException」というエラーをスローします。チェックしたところ、引数はどれも== nullではありません。

NB.Attach(Process.GetProcessesByName("javaw")[0]);

使用サンプル:

public static void Attach(Process process) 
    { 
     FocusProcess = process; 
     FocusWindow = FindWindow(null, process.MainWindowTitle); 
    } 

    public static int[] GetWindowPosition() 
    { 
     WindowRect rect = new WindowRect(); 

     Console.WriteLine(FocusProcess == null); 
     Console.WriteLine(FocusProcess.MainWindowHandle == null); 
     Console.WriteLine(rect==null); 
     GetWindowRect(FocusProcess.MainWindowHandle, out rect); 
     if (rect.Top != 0) 
     { 
      return new int[] { rect.Left, rect.Top }; 
     } 
     return new int[] { 0, 0 }; 
    } 
プロセスを添付する静的関数を実行

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetWindowRect(IntPtr handle, out WindowRect rect); 
    [StructLayout(LayoutKind.Sequential)] 
    private class WindowRect 
    { 
     public int Left; 
     public int Top; 
     public int Right; 
     public int Bottom; 
    } 

:ここ

はコード

呼び出すサンプルの一部です

事前に感謝します。ネイティブ関数の使用については、私は全く経験がありません。

+0

これは完全なコードですか? 'NullReferenceException'が.Net例外であり、' GetWindowRect'がそれを投げないので、確かにここに欠けているものがあります。 – DavidG

+0

GetWindowRect()を使用しようとすると、完全なコードとエラーが発生します。 – Netheous

+0

'FocusProcess'はここでは定義されていないので、それはできません。あなたは例外の完全なスタックトレースを投稿できますか? – DavidG

答えて

2

構造体をC#クラスとして宣言しました。それは既に参照型です。だから、それをアウトパラメータとして渡すと、今度はダブルポインタがあります。クラスのいずれかから

  • 変更は、
  • を構造体または値によってクラスを渡すことができます。
+1

完璧に動作します - 私はどのように多くの組み合わせを試してみましたか?構造体、クラス、アウト、ref - しかし、それは動作しませんでした。 ありがとうございました – Netheous

+0

受賞者チキンディナー –

関連する問題