получение HWND для моего собственного приложения в C

Или просто, вручную:

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

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

6
задан Community 23 May 2017 в 12:16
поделиться

8 ответов

Используйте GetTopWindow () и GetNextWindow () для просмотра окон в z-порядке.

] Однако не думайте, что это необходимо, GetWindowThreadProcessId () может вам помочь:

HWND FindMyTopMostWindow()
{
    DWORD dwProcID = GetCurrentProcessId();
    HWND hWnd = GetTopWindow(GetDesktopWindow());
    while(hWnd)
    {
        DWORD dwWndProcID = 0;
        GetWindowThreadProcessId(hWnd, &dwWndProcID);
        if(dwWndProcID == dwProcID)
            return hWnd;            
        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
    }
    return NULL;
 }
6
ответ дан 8 December 2019 в 12:22
поделиться

Ваше приложение не имеет HWND. Окно делает. У приложения может не быть окон или их может быть много, поэтому нет общей функции «Получить HWND приложения».

Очевидное решение - просто удерживать дескриптор, когда вы его получаете. Когда вы создаете окно, возвращается HWND. Сохраните это.

9
ответ дан 8 December 2019 в 12:22
поделиться

Это устарело для меня, но IIRC вы должны получить HWND как параметр в процессе окна. Вы можете сохранить его в глобальной переменной где-нибудь в начале.

0
ответ дан 8 December 2019 в 12:22
поделиться

Разве нельзя просто удерживать дескриптор, возвращаемый CreateWindow? Если нет, то почему?

1
ответ дан 8 December 2019 в 12:22
поделиться

Предположительно, ваш код вызывается кодом основного приложения, иначе какая польза от него? В этом случае я не понимаю, почему API вашего кода не может включать какой-либо способ информирования вас о дескрипторе главного окна приложения.

1
ответ дан 8 December 2019 в 12:22
поделиться

Как насчет имени вашего класса Windows? Всегда ли по-разному создается окно? В противном случае вы все равно могли бы использовать FindWindow ().

0
ответ дан 8 December 2019 в 12:22
поделиться

Как уже указывали другие

  • В общем, приложение может иметь ноль или несколько окон верхнего уровня.
  • Если вы создаете окно самостоятельно, вы можете просто запомнить HWND где-то.

Но, возможно, ваш код находится в DLL, поэтому вы на самом деле не создавали окно верхнего уровня самостоятельно. Итак, что делать?

Я бы посоветовал следующее:

  • Используйте EnumWindows для перечисления всех окон верхнего уровня.
  • Используйте GetWindowLongPtr , чтобы получить HINSTANCE для каждого окно верхнего уровня. Сравните это с HINSTANCE приложения, который вы можете получить с помощью GetModuleHandle (NULL) . Если они идентичны, вы нашли свое главное окно.

Edit: Вот код.

1
ответ дан 8 December 2019 в 12:22
поделиться

Вы можете внедрить DLL в поток, который обращается к user32.dll http://msdn.microsoft.com/en-us/library/ms821625.aspx

1
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: