Как получить дескриптор окна
Перейти к содержимому

Как получить дескриптор окна

  • автор:

Получение дескриптора окна (HWND)

В этом разделе показано, как в классическом приложении получить дескриптор окна для окна. В область рассматриваются приложения Библиотеки пользовательского интерфейса Windows (WinUI) 3, Windows Presentation Foundation (WPF) и Windows Forms (WinForms). Примеры кода представлены в C# и C++/WinRT.

Перечисленные выше платформы разработки и пользовательского интерфейса (в фоновом режиме) основаны на API Win32. В Win32 объект окна определяется значением, известным как дескриптор окна. А дескриптор окна — HWND (хотя он доступен в C# как IntPtr). В любом случае вы услышите термин HWND , используемый в качестве сокращения для дескриптора окна.

Существует несколько причин, по которым можно получить HWND для окна в классическом приложении WinUI 3, WPF или WinForms. Одним из примеров является использование HWND для взаимодействия с определенными объектами среда выполнения Windows (WinRT), которые зависят от CoreWindow для отображения пользовательского интерфейса. Дополнительные сведения см. в разделе Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow.

WinUI 3 с C#

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта Windows WinUI 3. В этом примере вызывается метод GetWindowHandle для класса взаимодействия C# WinRT.Interop.WindowNative . Дополнительные сведения о классах взаимодействия C# см. в статье Вызов API взаимодействия из приложения .NET.

// MainWindow.xaml.cs private async void myButton_Click(object sender, RoutedEventArgs e) < // Retrieve the window handle (HWND) of the current WinUI 3 window. var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this); >

WinUI 3 с C++

В приведенном ниже коде C++/WinRT показано, как получить дескриптор окна (HWND) для объекта Windows WinUI 3. В этом примере вызывается метод IWindowNative::get_WindowHandle .

// pch.h . #include // MainWindow.xaml.cpp void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) < // Retrieve the window handle (HWND) of the current WinUI 3 window. auto windowNative< this->m_inner.as() >; HWND hWnd< 0 >; windowNative->get_WindowHandle(&hWnd); > 

WPF с C#

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта окна WPF. В этом примере используется класс WindowInteropHelper .

// MainWindow.xaml.cs private void Button_Click(object sender, RoutedEventArgs e)

WinForms с C#

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта формы WinForms. В этом примере используется свойство NativeWindow.Handle .

// Form1.cs private void button1_Click(object sender, EventArgs e)

Связанные темы

  • Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow
  • Вызов API взаимодействия из приложения .NET
  • Библиотека пользовательского интерфейса Windows (WinUI) 3
  • Windows Presentation Foundation (WPF)
  • Windows Forms (WinForms)
  • C++/WinRT
  • API Win32

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Получение дескриптора окна консоли (HWND)

В этой статье описывается, как получить дескриптор окна консоли (HWND).

Применяется к: Windows Server 2012 R2
Исходный номер базы знаний: 124103

Сводка

Может быть полезно управлять окном, связанным с консольным приложением. API Win32 не предоставляет прямого метода для получения дескриптора окна, связанного с консольным приложением. Однако дескриптор окна можно получить, вызвав . FindWindow() Эта функция извлекает дескриптор окна на основе имени класса или имени окна.

Вызовите GetConsoleTitle() , чтобы определить название текущей консоли. Затем укажите заголовок текущей консоли в FindWindow() .

Дополнительная информация

Так как несколько окон могут иметь одинаковые названия, следует изменить заголовок текущего окна консоли на уникальный. Это поможет предотвратить возврат неправильного дескриптора окна. Используйте SetConsoleTitle() для изменения заголовка текущего окна консоли. Ниже приведен процесс.

  1. Вызовите, GetConsoleTitle() чтобы сохранить заголовок текущего окна консоли.
  2. Вызовите SetConsoleTitle() , чтобы изменить заголовок консоли на уникальный.
  3. Вызов спящего режима (40), чтобы убедиться, что заголовок окна обновлен.
  4. Вызовите FindWindow (NULL, uniquetitle), чтобы получить HWND, этот вызов возвращает HWND- или NULL в случае сбоя операции.
  5. Вызовите SetConsoleTitle() со значением, полученным на шаге 1, для восстановления исходного заголовка окна.

Необходимо протестировать результирующий HWND. Например, можно проверить, соответствует ли возвращенный HWND текущему процессу, вызвав GetWindowText() в HWND и сравнив результат с GetConsoleTitle() .

Полученный HWND не гарантирует, что подходит для всех операций дескриптора окна.

Пример кода

Следующая функция извлекает текущий дескриптор окна консольного приложения (HWND). Если функция выполнена успешно, возвращаемое значение является дескриптором окна консоли. Если функция завершается сбоем, возвращаемое значение равно NULL. Некоторые проверки ошибок опущены для краткости.

HWND GetConsoleHwnd(void) < #define MY_BUFSIZE 1024 // Buffer size for console window titles. HWND hwndFound; // This is what is returned to the caller. char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated // WindowTitle. char pszOldWindowTitle[MY_BUFSIZE]; // Contains original // WindowTitle. // Fetch current window title. GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE); // Format a "unique" NewWindowTitle. wsprintf(pszNewWindowTitle,"%d/%d", GetTickCount(), GetCurrentProcessId()); // Change current window title. SetConsoleTitle(pszNewWindowTitle); // Ensure window title has been updated. Sleep(40); // Look for NewWindowTitle. hwndFound=FindWindow(NULL, pszNewWindowTitle); // Restore original window title. SetConsoleTitle(pszOldWindowTitle); return(hwndFound); >

Получить дескриптор окна GLFW (#Окно без рамки)

Всем привет Делаю приложение с собственным интерфейсом, Но нигде нет инструкции как изменить стиль окна созданного с помощью glfw. По этому решил модифицировать окно через WinApi. Но так и не сумел получить дескриптор окна с помощью glfw. Сделал так чтобы получать дескриптор активного окна как только создано мое окно. Это работает рамку отключает, но в теории если в между созданием окна и применением свойства окна по какой то причине станет активным любое другое окно, то свойство применит к активному. Вопрос, Как получить дескриптор при помощи GLFW. Чтоб на 100% это был дескриптор созданного мной окна. Нашол вот такую команду glfwGetWin32Window(window) но мне IDE пишет что такой команды не существует. Вот код работоспособен, но не правильным способом. C++, visual studio 2010, glfw, WinApi.

#pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") #include // GLEW #define GLEW_STATIC #include // GLFW #include #include // GLFW #include #include int main() < // Init GLFW glfwInit(); // Set all the required options for GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(700, 500, "OpenGL", nullptr, nullptr); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); //HWND ds = FindWindow("Notepad", NULL); //Получит дескриптор пно названию возможно по классу? HWND ds = GetForegroundWindow(); //Получить дескриптор активного окна std::cout// Terminate GLFW, clearing any resources allocated by GLFW. glfwTerminate(); return 0; > 

Отслеживать
задан 4 июн 2019 в 18:19
722 9 9 серебряных знаков 27 27 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вам все это нужно, чтобы убрать рамку у окна?

Перед созданием окна делаете:

glfwWindowHint(GLFW_DECORATED, false); 

Отслеживать
ответ дан 4 июн 2019 в 19:25
HolyBlackCat HolyBlackCat
27.9k 3 3 золотых знака 27 27 серебряных знаков 40 40 бронзовых знаков

Капец, сколько вопросов по данной теме встречал, никто не ответил. И не одного годного ответа не было. Спасибо вам. Может вы ещё знаете, возможно ли и указать TransparencyKey для окна glfw. Если нужно могу сделать отдельный вопрос

5 июн 2019 в 9:49

@ЮрійПисанка Про transparency key не знаю, но есть glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, true); , позволяющая делать окно прозрачным/полупрозрачным в некоторых местах.

5 июн 2019 в 9:57

Спасибо получилось Установил glClearColor(0, 0, 0, 0); glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, true); И чёрный цвет стал прозрачным

�� Как узнать дескриптор окна python: простой способ и руководство по использованию

В этом примере мы создаем главное окно с помощью tkinter.Tk(). Затем мы используем метод winfo_id() для получения дескриптора окна. Наконец, мы выводим полученный дескриптор окна.

Детальный ответ

Как узнать дескриптор окна Python

Когда вы работаете с графическими интерфейсами в Python, иногда может возникнуть необходимость получить дескриптор окна. Дескриптор окна является уникальным идентификатором, который позволяет программно взаимодействовать с конкретным окном. В данной статье мы рассмотрим несколько способов узнать дескриптор окна в Python.

Использование библиотеки PyGetWindow

  1. Установите библиотеку PyGetWindow, если ее еще нет. Для установки воспользуйтесь командой:
pip install PyGetWindow
import pygetwindow as gw
windows = gw.getWindowsWithTitle('Название окна')
window = windows[0] hwnd = window.hwnd

Теперь у вас есть дескриптор окна, который вы можете использовать для взаимодействия с ним.

Использование сторонних библиотек

Если вы не хотите использовать библиотеку PyGetWindow, можно воспользоваться сторонними библиотеками, такими как pywinauto или pyautogui. Эти библиотеки также предоставляют API для работы с окнами операционной системы и позволяют получить дескриптор окна в Python.

Например, с помощью библиотеки pywinauto вы можете получить дескриптор окна следующим образом:

from pywinauto import Application app = Application().connect(title='Название окна') hwnd = app.window().handle

А с помощью библиотеки pyautogui вы можете использовать функцию getWindow, чтобы получить дескриптор окна по координатам на экране:

import pyautogui x, y, width, height = pyautogui.getWindow('Название окна') hwnd = pyautogui.getWindowsAt(x, y)[0]

Это лишь некоторые примеры, и существуют и другие способы получить дескриптор окна в Python. Выбор способа зависит от ваших потребностей и предпочтений.

Вывод

В данной статье мы рассмотрели несколько способов узнать дескриптор окна в Python. Вы можете использовать библиотеки, такие как PyGetWindow, pywinauto или pyautogui, или искать другие методы, подходящие для вашей задачи. Дескриптор окна позволяет программно взаимодействовать с окном, открывая широкие возможности для создания графических интерфейсов в Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *