我使用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变量吗?如果是这样,到底是什么?
答案 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
。