Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Lấy Handle (HWND) của Console Window [Hướng dẫn + Souce code]

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Mặc định Lấy Handle (HWND) của Console Window

    Win32 API không cung cấp bất kỳ phương thức nào để có thể lấy trực tiếp Handle(HWND) của Console Window.
    Rất nhiều cửa sổ console có cùng title, vì thế việc lấy handle của Console Window cần tiến hành theo các bước như sau:

    1. Lấy title của cửa sổ Console hiện tại bằng GetConsoleTitle
    2. Thay đổi title cửa sổ Console bằng SetConsoleTitle để có được một title không trùng
    3. Sleep(40) để chắc chắn title được cập nhật
    4. Dùng FindWindow với title thu được ở bước 2
    5. Thay đổi lại title cho đúng với ban đầu

    Sau đây là source code:

    Visual C++ Code:
    1.    HWND GetConsoleHwnd(void)
    2.    {
    3.        #define MY_BUFSIZE 1024                 // Buffer size for console window titles.
    4.        HWND hwndFound;                         // This is what is returned to the caller.
    5.        char pszNewWindowTitle[MY_BUFSIZE];    // Contains fabricated WindowTitle.
    6.        char pszOldWindowTitle[MY_BUFSIZE];     // Contains original WindowTitle.
    7.  
    8.        // Fetch current window title.
    9.        GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
    10.  
    11.        // Format a "unique" NewWindowTitle.
    12.        sprintf(pszNewWindowTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
    13.  
    14.        // Change current window title.
    15.        SetConsoleTitle(pszNewWindowTitle);
    16.  
    17.        // Ensure window title has been updated.
    18.        Sleep(40);
    19.  
    20.        // Look for NewWindowTitle.
    21.        hwndFound=FindWindow(NULL, pszNewWindowTitle);
    22.  
    23.        // Restore original window title.
    24.        SetConsoleTitle(pszOldWindowTitle);
    25.  
    26.        return(hwndFound);
    27.    }

    Bài viết dịch lược từ MSDN chia sẻ cho thành viên cộng đồng C Việt!

  2. #2
    Ngày gia nhập
    09 2015
    Bài viết
    2

    chào các bác, có khả năng em là người thích đào mỏ vì bài này hơi cũ. em đang học C#, hỏi google nhiều lần nhưng không có câu trả lời , em tìm thấy bài này nhưng lại viết bằng C++, bác nào giúp em demo bằng c# với hạ, cảm ơn các bác nhiều.

  3. #3
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    902

    Trích dẫn Nguyên bản được gửi bởi hoibao Xem bài viết
    chào các bác, có khả năng em là người thích đào mỏ vì bài này hơi cũ. em đang học C#, hỏi google nhiều lần nhưng không có câu trả lời , em tìm thấy bài này nhưng lại viết bằng C++, bác nào giúp em demo bằng c# với hạ, cảm ơn các bác nhiều.
    Bạn xem thử mã này
    Visual C# Code:
    1. using System;
    2. using System.Text;
    3. using System.Threading;
    4. using System.Runtime.InteropServices;
    5.  
    6. namespace ConsoleApplication1
    7. {
    8.     class Program
    9.     {
    10.         // GetConsoleTitle
    11.         [DllImport("kernel32.dll", EntryPoint = "GetConsoleTitle", CharSet = CharSet.Unicode, SetLastError = true)]
    12.         static extern uint GetConsoleTitle(StringBuilder lpConsoleTitle, uint nSize);
    13.         // SetConsoleTitle
    14.         [DllImport("kernel32.dll")]
    15.         static extern bool SetConsoleTitle(string lpConsoleTitle);
    16.         // GetTickCount
    17.         [DllImport("kernel32.dll")]
    18.         static extern uint GetTickCount();
    19.         // GetCurrentProcessId
    20.         [DllImport("kernel32.dll")]
    21.         static extern uint GetCurrentProcessId();
    22.         // FindWindow
    23.         [DllImport("user32.dll", SetLastError = true)]
    24.         static extern uint FindWindow(string lpClassName, string lpWindowName);
    25.         // SetWindowText
    26.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    27.         public static extern bool SetWindowText(uint hwnd, string lpString);
    28.  
    29.         //////////////////// Code ////////////////////
    30.         static uint GetConsoleHwnd()
    31.         {
    32.             const int MY_BUFSIZE = 1024;
    33.             StringBuilder strOld = new StringBuilder(MY_BUFSIZE);
    34.             GetConsoleTitle(strOld, MY_BUFSIZE);
    35.             string strNew = String.Format("%d/%d", GetTickCount(), GetCurrentProcessId());
    36.             SetConsoleTitle(strNew);
    37.             Thread.Sleep(40);
    38.             uint hwnd = FindWindow(null, strNew);
    39.             SetConsoleTitle(strOld.ToString());
    40.             return hwnd;
    41.         }
    42.         // Main Sẽ dùng thẻ cửa sổ Console để thay đổi Title của chính nó
    43.         static void Main(string[] args)
    44.         {
    45.             uint hwnd = GetConsoleHwnd();
    46.             Console.WriteLine(String.Format(" HWND = {0,8:X8}", hwnd));
    47.  
    48.             Console.WriteLine();
    49.             Console.WriteLine(" Thay doi Title thanh \"CongDongCViet\" sau 5 giây");
    50.             Thread.Sleep(5000);
    51.             SetWindowText(hwnd, "CongDongCViet");
    52.  
    53.             Console.WriteLine();
    54.             Console.WriteLine(" Thay doi Title thanh \"Demo GetConsoleHwnd\" sau 5 giây");
    55.             Thread.Sleep(5000);
    56.             SetWindowText(hwnd, "Demo GetConsoleHwnd");
    57.  
    58.             Console.WriteLine();
    59.             Console.WriteLine(" Hoan thanh, Nhan phim de thoat");
    60.             Console.ReadKey();
    61.         }
    62.     }
    63. }

  4. #4
    Ngày gia nhập
    09 2015
    Bài viết
    2

    em không tìm thấy nút thank ở đâu, nhưng thank bác nhiều, em sẽ nghiên cứu tiếp, có gì em lại hỏi.

Các đề tài tương tự

  1. xử lý sự kiện Click chuột vào window đã biết handle
    Gửi bởi vakt4793 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 25-03-2013, 04:46 PM
  2. Mã nguồn C++ Hàm nhập password trong console [Souce code C++]
    Gửi bởi doicanhden trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 08-05-2012, 11:54 PM
  3. Lấy Handle của Window(process) khi biết class ?
    Gửi bởi azurelonely trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 30-10-2011, 02:24 PM
  4. Hỏi : cho em hỏi hWnd, HINSTANCE, và handle khác nhau thế nào??
    Gửi bởi quangnh89 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 01-08-2009, 06:19 PM
  5. Phân Biệt Handle và HWND trong lập trình Windows
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 8
    Bài viết cuối: 05-01-2009, 09:11 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn