精华内容
下载资源
问答
  • 如何获取控制台窗口句柄 (HWND)

    千次阅读 2013-02-03 22:45:08
    Win32 API 没有直接的方法用于获取控制台应用程序关联的窗口句柄。但是,您可以获取通过调用 FindWindow() 的窗口句柄。此函数可检索基于的类名或窗口的窗口句柄。 调用 GetConsoleTitle() 来确定当前的
     
    

    概要

    它将会有助于处理与控制台应用程序关联的窗口。 Win32 API 没有直接的方法用于获取与控制台应用程序关联的窗口句柄。 但是,您可以获取通过调用 FindWindow() 的窗口句柄。 此函数可检索基于的类名或窗口的窗口句柄。

    调用 GetConsoleTitle() 来确定当前的控制台标题。 然后将当前控制台标题传递给FindWindow()。

    更多信息

    因为多个窗口可能具有相同的标题,您应该更改唯一标题的当前控制台窗口标题。 这将有助于防止返回此错误的窗口句柄。 使用 SetConsoleTitle() 来更改当前的控制台窗口标题。 下面是此过程:
    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);
       }
    				

    属性

    文章编号: 124103 - 最后修改: 2012年10月7日 - 修订: 3.0
    关键字: 
    kbhowto kbwndw kbmt KB124103 KbMtzh
    展开全文
  • VC 获取控制台窗口的句柄(hWnd)

    千次阅读 2015-07-18 13:41:03
    例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为...

    在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。控制台程序也有窗口句柄,并且他可以操作其他程序的窗口句柄。

    常用方法:

    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来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。尽管载入的代码很长,但是通用性更高。

    
    展开全文
  • 获取控制台窗口的句柄

    万次阅读 2011-08-18 00:27:50
    窗口,都有其唯一的句柄(hWnd)。...控制台程序,若能在窗口效果上下文章,那么这个第三方工具将会很成功。 网上给出的常用方法: HWND hw=FindWindow("ConsoleWindowClass",NULL); 这不失为一个好方法,但
      
    

    窗口,都有其唯一的句柄(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来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。尽管载入的代码很长,但是通用性更高。

    展开全文
  • VC 获取控制台窗体的句柄(hWnd)

    千次阅读 2019-08-08 09:58:14
    Windows中,句柄是外国话,理解为编号的意思,只要你知道了这个窗口的句柄,就可以对这个窗体进行操作——移动窗体、改变窗体大小、把窗体极小化为图标等。Windows API函数中的句柄代表一些特殊元素,如窗体、位图...

          在Windows中,句柄是外国话,理解为编号的意思,只要你知道了这个窗口的句柄,就可以对这个窗体进行操作——移动窗体、改变窗体大小、把窗体极小化为图标等。Windows API函数中的句柄代表一些特殊元素,如窗体、位图、图标、内存块、光标、字体、菜单等。

    在WinAPI中,

    FindWindowA(LPCSTR lpClassName ,LPCSTR lpWindowName);

    既可以通过窗口类名又可以通过窗口名称查找窗口句柄,如果只知道一个就把另一个写成null.

    控制台程序也有窗体句柄。而且他能够操作其它程序的窗体句柄。

    经常用法:

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

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

    API函数FindWindow有两个參数,类名与窗体标题。当不提供窗体标题的时候,返回的句柄为同类窗体中Z序最高的窗体句柄。尽管说运行仅仅是一瞬间。可是保险起见,还是提供下标题窗体,更保险。

    char strTitle[255];

    GetConsoleTitle(strTitle, 255); //获取窗口的标题

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

    ===============================================================

            当然,假设要精益求精,还有更保险的办法,用 Kernel32.dll 中部分未发布的API。在用 eXeScope 导出 (在VS2019中不需要导出)Kernel32.dll 中控制台相关的API之后。发现有一个名为GetConsoleWindow的API。查找參考了部分资料后。提供例如以下代码,可以动态加载这个API并获得窗体句柄。

    首先须要全局声明:

    typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();//声明一个新的类型
    PROCGETCONSOLEWINDOW xxx;//句柄的指针
    
    然后再Main()函数开头中输入下面内容:
    HMODULE hKernel32 = GetModuleHandle("kernel32");//获取kernel32模块
    xxx= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");//获取模块中的句柄
    完毕了动态加载API函数GetConsoleWindow的任务。须要使用时可例如以下:
    HWND hd=GetConsoleWindow();
    个人觉得。使用API函数GetConsoleWindow是最安全,也是最好的方法。
    

    #include "windows.h"
    #include <iostream>
    using namespace std;
    typedef HWND (WINAPI* PROCGETCONSOLEWINDOW)();
    PROCGETCONSOLEWINDOW xx;
    int main()
    {

        HMODULE hKernel32 = GetModuleHandle(L"kernel32");
        xx = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32, "GetConsoleWindow");//注意这里的函数名不需要用L
        HWND hd = GetConsoleWindow();
        //HWND hd = GetActiveWindow();//想用获取当前激活窗口的句柄去获取控制台句柄的方法行不通
        cout << "中华人民共和国";
        RECT rect;
        GetWindowRect(hd, &rect);//得到窗口的大小
        int w = rect.right - rect.left;
        int h = rect.bottom - rect.top;
        cout << "w=" << w << " " << "h=" << h;
        MessageBox(hd, L"内容", L"标题", MB_OK);
        MoveWindow(hd, 100, 100, w, h, false);//移动窗口

        cin.get();//目的是暂停程序的执行,让看清执行结果
        return 0;
    }
    在更大的控制台编程中,可能随时须要用到AttachConsole来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。虽然加载的代码非常长,可是通用性更高。

    =================================================================

    补充资料:

    我们想获得酷我音乐盒的窗口句柄并移动它,该怎么办呢?

     

    首先打开VC或者VS里面tool中的SPY++点击查找窗口如下:

    PS:把那个靶心似的的东西移动到想查找的窗口上,这里是酷我音乐盒,下面会出现窗口的信息,包括窗口的句柄、名字、类、类型、大小和位置。点击OK还有更多信息~

    PS:因为FindWindowA(LPCSTR lpClassName ,LPCSTR lpWindowName);既可以通过窗口类名又可以通过窗口名称查找窗口句柄,如果只知道一个就把另一个写成null.这里我们会发现它的窗口名称会随着播放的歌曲的变化而变化,所以通过窗口名来查找窗口句柄是不明智的(不过我们可以通过窗口名字获得当前播放音乐的名称哦!),因此我们用窗口类名获得窗口句柄。

    参考网址:https://www.cnblogs.com/yfceshi/p/6933234.html

    https://www.cnblogs.com/zjutlitao/p/3889900.html

    金庭波

    2019/8/8

     

    展开全文
  • 在创建direct 3D对象时需要一个窗口句柄,在命令行程序中又不想调用windows api创建窗口对象,所以尝试查找控制台下有无可用并且有效的窗口句柄。找了一下,函数原型如下: HWND WINAPI GetConsoleWindow(void); ...
  • 陈拓 2021/08/28-2020/08/28 1. 概述 在《海康威视SDK控制台程序consoleDemo》 ... ... 一文中我们已经编译成功了海康威视SDK的控制台...在《海康威视SDK控制台程序consoleDemo获取视频通道参数》 https://zhuanlan.zh
  • 在自动化办公的趋势下,繁琐的工作可以让程序自动完成。比如自动化测试、自动下单交易等。很多软件除了可以GUI方式操作外还可以用CLI接口操作,不过当一些软件未提供CLI接口时,我们应该怎么办呢?我们还可以用程序...
  • 既然CreateProcess指定的程序启动参数,对于GUI程序无效(我暂时真的不知道为什么…),那可以让程序启动以后,获取它的Handle,然后模拟操作系统向它发送消息,让其响应。 CreateProcess可以得到被启动的...
  • 在做WPF桌面端软件的时候需要调用别人的exe控制台程序,单独运行exe需要手动输入参数,并进行一些参数选择,要控制exe程序就需要用到匿名管道。 主要步骤: 1.启动控制台exe的Process对象 2.输入输出流重定向...
  • int GetConsoleExeOutPutCreatePipeAndCreateProcess( char * pstrExename_pstrCmdLine ) { HANDLE hRead1, hWrite1; //读句柄,写句柄 HANDLE hRead2, hWrite2; //读句柄,写句柄 HANDLE hCmd; int ret; SECURI
  • Windows控制台输入

    2020-02-24 14:58:28
    Windows API为程序员提供了极大方便,如ReadConsoleInput,它提供有关控制台的一系列事件处理,能更好地处理控制台事件
  • 打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口 在运行对话框中可以通过cmd /c 命令 和 cmd /k 命令 的方式来直接运行命令 /c表示执行完命令后关闭cmd窗口;/k表示执行完命令后保留cmd窗口 右键弹出快捷...
  • 1. 编写控制台程序,获得标准输入输出的窗口句柄GetStdHandle 函数声明如下 : HANDLE GetStdHandle( DWORD nStdHandle ); GetStdHandle()返回标准的输入、...
  • 获取控制台程序的HWND和HINSTANCE

    千次阅读 2010-08-19 21:25:00
    一,获取HWND的方法: 1,API:HWND GetConsoleWindow(NULL) Client Requires Windows Vista, Windows XP, or Windows 2000 Professional. Server Requires Windows Server 2008, Windows Server 2003, or Windows ...
  • 00. 目录 文章目录00. 目录01. 句柄02....​ 句柄Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象...
  • CreateProcess("E:\\61\\61.exe",NULL//"c:\\Windows\\system32\\cmd.exe dir /?" ,NULL,NULL,TRUE,NULL,NULL,"E:\\61",&si,&pi)) { MessageBox(NULL, "Error on CreateProcess()", NULL, NULL); return 0; }...
  • <span style="color:#000000">...// SpyDemo.cpp : 定义控制台应用程序的入口点。 // <span style="color:#880000 !important"><em>#include "stdafx.h"</em></span> <span style=
  • C++ 获取窗口句柄

    万次阅读 2015-06-01 11:48:35
    1、使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置。 [html] view plaincopy #include Windows.h>  #...
  • 获取当前句柄的4种方法

    万次阅读 2017-06-30 21:50:19
    我们经常会获取当前进程的进程句柄,那么获取进程句柄的方法都有哪些呢?下面是总结的三种方法。 注意:句柄其实就是应用程序的其实地址。 方法1. 使用win32 API函数实现该功能。如下代码所示: #include #...
  • 设计要求:写一个单进程多线程的Windows控制台程序,该程序在一个进程内建立N个线程来执行指定的任务。N由命令行传递给系统。Win32控制台程序中,主函数的格式如:Void main(int argc,char *argv[]),可以获取命令行...
  • Windows应用程序是基于消息驱动的,任何线程只要注册窗口类都会有一个消息队列用于接收用户输入的消息和系统消息。 一、 窗口的创建流程 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类(填写...
  • VC中控制台程序如何创建窗口

    千次阅读 2016-09-24 17:18:28
    转载出至:...在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像 #include "windows.h" #include "TCHAR.h" //声明自定义消息处理函数 LRESULT CALLBACK WindowProc( HWND h
  • SetWindowPos(GetConsoleWindow()/*获取当前窗口句柄*/, 0, 0, 0, W, H, SWP_NOMOVE/*不修改坐标*/); //修改窗口宽高 SetWindowPos(GetConsoleWindow(), 0, X, Y, 0, 0, SWP_NOSIZE/*不修改宽高*/); /*修改窗口坐标*...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,860
精华内容 4,344
关键字:

获取windows控制台程序句柄