Всем привет.
Собственно сабж.
"Нужно выяснить что handle принадлежит окну (форма или wpf или диалог) но не контекстному меню из трея или taskbar-у?"
Более пользовательским языком - надо проверить, что foreground window (handle которого у меня есть) является именно окном, а не каким-то системным элементом управления типа контекстного меню в трее, иконкой или каким другим контролом. Функции GetWindowRect без разницы что возвращать, когда есть handle, поэтому ею не проверить "а не от окна ли это координаты"?
Update Решение:
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern UInt32 GetWindowLong(IntPtr hWnd, int index);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
private const int GWL_STYLE = -16;
private const int GWL_EXSTYLE = -20;
private const ulong WS_VISIBLE = 0x10000000L;
private const ulong WS_BORDER = 0x00800000L;
private const int WS_EX_TOPMOST = 0x0008;
// https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx
private const int
WS_EX_APPWINDOW = 0x00040000,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_TRANSPARENT = 0x00000020,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
;
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx
private const UInt32 WS_MAXIMIZE = 0x01000000, WS_MINIMIZE = 0x20000000, WS_POPUP = 0x80000000, WS_CAPTION = 0x00C00000, WS_DISABLED = 0x08000000;
IntPtr fore_ptr = GetForegroundWindow();
IntPtr mainWindowHandle = process.MainWindowHandle;
//Console.WriteLine("process.Name:"+process.ProcessName+", fore_ptr:" + fore_ptr+ ", mainWindowHandle:"+ mainWindowHandle);
//fore_ptr = mainWindowHandle;
UInt32 _result_exstyle = 0;
UInt32 _result_style = 0;
bool visible = false;
_result_exstyle = GetWindowLong(startWindowHandle, GWL_EXSTYLE);
_result_style = GetWindowLong(startWindowHandle, GWL_STYLE);
// Определить видимость окна:
if ( (_result_exstyle & WS_EX_TOOLWINDOW)==0
&& (_result_style & WS_VISIBLE)!=0
) {
visible = true;
}
теперь в visible признак того, что окно fore_ptr видимо.
Для удобства определения стилей окна удобно пользоваться инструментом Spy++, входящего в Visual Studio: