GetWindowLong(int hWnd,GWL_STYLE)在c#中返回奇怪的数字

时间:2009-08-13 10:40:14

标签: c#

我使用GetWindowLong窗口api来获取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变量吗?如果是这样,到底是什么?

2 个答案:

答案 0 :(得分:7)

这些价​​值观有什么奇怪之处?例如,482344960相当于0x1CC00000,它看起来像您可能期望看到的窗口样式。查看您链接到的样式引用,即WS_VISIBLE | WS_CAPTION | 0xC000000

例如,如果您想测试WS_VISIBLE,您可以执行以下操作:

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

答案 1 :(得分:0)

您可能希望改为使用GetWindowLongPtr,并将返回值更改为long。此方法使用不同的返回类型LONG_PTR,这听起来像您正在寻找的。

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

LONG GetWindowLong(      
    HWND hWnd,
    int nIndex
);

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

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

根据MSDN,如果您运行的是64位Windows,则需要使用GetWindowLongPtr,因为GetWindowLong仅使用32位LONG,这会在到达结束时为您提供负值32位长。另外,听起来GetWindowLong已被GetWindowLongPtr取代,因此它可能是未来发展的正确方法。

这是您应该用来从GetWindowLongPtr返回值的导入。

[DllImport("user32.dll")]
static extern long GetWindowLongPtr(IntPtr hWnd, int nIndex);
无论平台如何,.NET都使用64位long