Konsol Penceresi Tanıtıcısı (HWND) edinme

Bu makalede Konsol Penceresi Tanıtıcısı'nın (HWND) nasıl alındığı açıklanır.

Şunlar için geçerlidir: Windows Server 2012 R2
Özgün KB numarası: 124103

Özet

Konsol uygulamasıyla ilişkili bir pencereyi işlemek yararlı olabilir. Win32 API'sinde bir konsol uygulamasıyla ilişkili pencere tutamacını almak için doğrudan bir yöntem sağlanmaz. Ancak, çağırarak FindWindow()pencere tutamacını alabilirsiniz. Bu işlev, sınıf adına veya pencere adına göre bir pencere tutamacını alır.

Geçerli konsol başlığını belirlemek için çağrısı GetConsoleTitle() . Ardından geçerli konsol başlığını öğesine sağlayın FindWindow().

Daha fazla bilgi

Birden çok pencere aynı başlığa sahip olabileceğinden, geçerli konsol penceresi başlığını benzersiz bir başlıkla değiştirmeniz gerekir. Bu, yanlış pencere tanıtıcısının döndürülmesini önlemeye yardımcı olur. Geçerli konsol penceresi başlığını değiştirmek için kullanın SetConsoleTitle() . İşlem şu şekildedir:

  1. Geçerli konsol penceresi başlığını kaydetmek için çağrısı GetConsoleTitle() yapın.

  2. Konsol başlığını benzersiz bir başlıkla değiştirmek için çağrısında SetConsoleTitle() bulunur.

  3. Pencere başlığının güncelleştirildiğinden emin olmak için Sleep(40) çağrısı yapın.

  4. HWND'yi almak için çağrısı FindWindow(NULL, uniquetitle), bu çağrı HWND'yi döndürür veya işlem başarısız olursa NULL döndürür.

  5. Özgün pencere başlığını geri yüklemek için 1. adımdan alınan değerle çağrısı SetConsoleTitle() yapın.

Sonuçta elde edilen HWND'yi test etmelisiniz. Örneğin, döndürülen HWND'nin HWND'yi çağırarak GetWindowText() ve sonucu ile GetConsoleTitle()karşılaştırarak geçerli işleme karşılık gelipgelmediğini test edebilirsiniz.

Sonuçta elde edilen HWND'nin tüm pencere işleme işlemleri için uygun olacağı garanti değildir.

Örnek Kod

Aşağıdaki işlev geçerli konsol uygulaması pencere tutamacını (HWND) alır. İşlev başarılı olursa, dönüş değeri konsol penceresinin tanıtıcısıdır. İşlev başarısız olursa dönüş değeri NULL olur. Kısa bir süre için bazı hata denetimi atlanır.

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);
   }