AlexXYZ
@AlexXYZ
O Keep Clear O

[Solved] C# Есть handle. Нужно выяснить что handle принадлежит окну (форма, wpf) но не контекстному меню из трея или taskbar-у?

Всем привет.

Собственно сабж.
"Нужно выяснить что 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:

cb345b1ffd1947209e9dca6ebe60a9ce.png
  • Вопрос задан
  • 1073 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы