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

Так как я не мог найти ответ на этой вопрос я исследовал немного дальше в MSDN, и я нашел isChild(). Это может дать мне ответ на другой вопрос.

теперь, чтобы использовать isChild () мне нужно передать HWND родительского приложения, которое я хочу проверить, в этом случае мое собственное приложение. Как получить HWND моего собственного приложения?

Я не знаю название, так как он постоянно меняется, поэтому я не могу использовать FindWindow().

спасибо

Edit:

Так как это не ясно, я добавлю больше информации: Я не создаю окно. У меня нет доступа к созданию окна. Мой код-это фрагмент кода, который компилируется вместе с любым приложением, которое кодирует другой программист, и у меня нет доступа к тому, как создается окно, название или любая другая информация. Итак, как мне получить HWND в "окно" приложения, которое я запускаю?

8 ответов


используйте GetTopWindow () и GetNextWindow (), чтобы пройти через windows z-order.

однако не думайте, что это необходимо, но вы можете использовать GetCurrentProcessId () и 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;
 }

в вашем приложении нет HWND. Это делает окно. У приложения может не быть окон или их может быть много, поэтому нет общей функции "получить HWND приложения".

очевидное решение - просто держаться за ручку, когда вы ее получите. При создании окна возвращается HWND. Магазин.


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


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


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

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

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

Я бы предложил следующее:

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

Edit: вот некоторый код. Оказывается, вы также должны использовать IsWindowVisible потому что, кажется, есть довольно много невидимых "вспомогательных" окон.

HWND hwndMain;

BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
    HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);

    if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
        IsWindowVisible(hwnd))
    {
        hwndMain=hwnd;
        return FALSE;
    }
    else
        return TRUE;
}

тогда в том месте, где вы хотите найти окно:

hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);

и после этого hwndMain должен содержать ручку окна, или NULL если нет.

используя EnumWindows немного обременительно, но рекомендуется по вызову GetWindow в цикле, потому что, как отмечает MSDN: "приложение, которое вызывает GetWindow для выполнения этой задачи, рискует быть пойманным в бесконечном цикле или ссылаться на дескриптор на окно, которое было уничтожено."


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


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


Как насчет вашего имени класса windows? Всегда ли это отличается от создания окна? Если нет, вы все еще можете найти FindWindow ().