2009-08-13 13 views
3

GetWindowLongウィンドウAPIを使用して、C#でウィンドウの現在のウィンドウ状態を取得しました。GetWindowLong(int hWnd、GWL_STYLE)はCで奇妙な数値を返します。

[DllImport("user32.dll")] 
    static extern int GetWindowLong(IntPtr hWnd, int nIndex); 


    Process[] processList = Process.GetProcesses(); 
    foreach (Process theprocess in processList) 
    { 

     long windowState = GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE); 

     MessageBox.Show(windowState.ToString()); 

    } 

私はhttp://www.autohotkey.com/docs/misc/Styles.htm上の番号を取得することが期待が、私は次のように番号を取得-482344960、-1803550644、および382554704.

私はのWindowState変数を変換する必要がありますか?もしそうなら、何に?

+1

すると、たとえば、あなたが何かをするだろう、WS_VISIBLEをテストしたい場合。私は彼らが間違っているとは思わない。 –

+0

@Henk Holterman:そうです。私はそれらの値を変換して比較すべきです。 – Moon

答えて

6

これらの値については何が奇妙ですか?たとえば、482344960は、0x1CC00000に相当します。これは、ウィンドウスタイルとして見えるようなものです。あなたがリンクしているスタイル参照を見ると、それはWS_VISIBLE | WS_CAPTION | 0xC000000です。たぶん、あなたはヘクス、あなたが期待したものとそれらを比較するためにこれらの値を変換する必要があり

int result = GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE); 
bool isVisible = ((result & WS_VISIBLE) != 0); 
+0

oopps ...なぜ私はそれについて考えることができませんでしたか?......これはまさに私が欲しかったことです。 – Moon

1

私はあなたが(インポート)GetWindowLongを定義したのか分からないけど名前だけではそれがあるべき示唆:

long windowState = GetWindowLong(...); 
+0

@Henk Holterman:ロングタイプを使用していても、奇数を返す。私は質問を更新しました。 – Moon

+2

@Henk Holterman: 'int'は正しいです。 Win32 APIでは、 'LONG'は32ビット符号付き整数です。これはC#の' int'型に相当します。 C# 'long'は64ビットの符号付き整数です。 – Nate

1

あなたがおそらく代わりにGetWindowLongPtrを使用したいと思われる、との戻り値を変更しますlong。このメソッドは、あなたが探しているもののように聞こえるLONG_PTRの異なる戻り値の型を使用します。

GetWindowLonghttp://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

LONG GetWindowLong(  
    HWND hWnd, 
    int nIndex 
); 

GetWindowLongPtrhttp://msdn.microsoft.com/en-us/library/ms633585(VS.85).aspx

LONG_PTR GetWindowLongPtr(  
    HWND hWnd, 
    int nIndex 
); 

MSDNによるとGetWindowLongのみ32を使用しているので、あなたは、あなたがGetWindowLongPtrを使用する必要があり、64ビットのWindowsを実行している場合32ビットのLONGの終わりに達した後に負の値を与えるLONGのビット。さらにGetWindowLongGetWindowLongPtrに取って代わられているように聞こえるので、将来の発展のためにはおそらく正しい方法です。

GetWindowLongPtrの値を返すために使用するインポートです。

[DllImport("user32.dll")] 
static extern long GetWindowLongPtr(IntPtr hWnd, int nIndex); 

.NETはプラットフォームに関係なく64ビットのlongを使用します。

関連する問題