• 得到控制台窗口的句柄


    1. 调用 GetConsoleTitle() 来保存当前的控制台窗口标题。
    2. 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题。
    3. 调用 Sleep(40),以确保已更新窗口标题。
    4. 调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果操作失败,将返回 NULL。
    5. 从步骤 1 中,若要恢复原始窗口标题检索调用 SetConsoleTitle() 的值。

    您应该测试结果的 HWND。例如,您可以测试是否返回的 HWND 对应于当前进程在 HWND 上调用 GetWindowText() 并将结果与 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);
       }
    			





    窗口,都有其唯一的句柄(hWnd)。得到了窗口句柄,能够做很多事情。控制台程序,若能在窗口效果上下文章,那么这个第三方工具将会很成功。

    网上给出的常用方法:

    HWND hw=FindWindow("ConsoleWindowClass",NULL);

    这不失为一个好方法,但是单从Class方面入手保险度不高。

    API函数FindWindow有两个参数,类名与窗口标题。当不提供窗口标题的时候,返回的句柄为同类窗口中Z序最高的窗口句柄。虽然说执行只是一瞬间,但是保险起见,还是提供下标题窗口,更保险。

    char strTitle[255];
    GetConsoleTitle(strTitle, 255);
    HWND hw=FindWindow("ConsoleWindowClass",strTitle);

    当然,如果要精益求精,还有更保险的办法,用 Kernel32.dll 中部分未公布的API。在用 eXeScope 导出 Kernel32.dll 中控制台相关的API之后,发现有一个名为GetConsoleWindow的API。查找参考了部分资料后,提供如下代码,能够动态载入这个API并获 得窗口句柄。

    首先需要全局声明:

    typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
    PROCGETCONSOLEWINDOW GetConsoleWindow;

    然后再Main()函数开头中输入以下内容:

    HMODULE hKernel32 = GetModuleHandle("kernel32");
    GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");

    完成了动态载入API函数GetConsoleWindow的任务。需要使用时可如下:

    HWND cmd=GetConsoleWindow();

    个人认为,使用API函数GetConsoleWindow是最安全,也是最好的方法。在更大的控制台编程中,可能随时需要用到AttachConsole来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。尽管载入的代码很长,但是通用性更高。

  • 相关阅读:
    MOP tricks
    DTLZ
    箱型图Box
    IDEA代码折叠
    IDEA快捷键无法使用
    [转].gitignore文件不起作用的解决方案
    你必须知道的EF知识和经验
    采用MiniProfiler监控EF与.NET MVC项目
    EF使用CodeFirst方式生成数据库&技巧经验
    EF查询之性能优化技巧
  • 原文地址:https://www.cnblogs.com/dragon2012/p/2965468.html
Copyright © 2020-2023  润新知