精华内容
下载资源
问答
  • windows的两类窗口是
    千次阅读
    2019-09-22 16:48:10

    目录

    窗口类API汇总(持续更新)

    1.FindWindowA()  获取窗口句柄

    2.SetWindowPos()  设置窗口的位置、大小和显示方式


    窗口类API汇总(持续更新)

     

    1.FindWindowA()  获取窗口句柄

    官方文档

    (1)语法:

    HWND FindWindowA(
      LPCSTR lpClassName,
      LPCSTR lpWindowName
    );

    (2)参数解释

    lpClassName: 窗口的类名

    lpWindowName:窗口的名称

    (一般这两个值都是通过spy.exe来抓取到的);

    (3)返回值

    如果抓取到了,会返回窗口的句柄HWND(实质是窗口的地址)

    如果抓取不到,返回NULL

    PS:这个函数只能搜索根窗口(top-lever window),如果要搜索子窗口,需要通过调用FindWindowExA()来实现

     

    2.FindWindowExA() 寻找某一窗口句柄的子窗口

    官方文档

    (1)语法:

    HWND FindWindowExA(
      HWND   hWndParent,
      HWND   hWndChildAfter,
      LPCSTR lpszClass,
      LPCSTR lpszWindow
    );

    (2)参数解释

     hWndParent: 父窗口的句柄,如果为NULL,则默认桌面为父窗口,即相当于FindWindowA()

     hWndChildAfter:搜索的参照句柄,如果指定,则将从这个子窗口沿Z轴方向开始搜索;为NULL,则从父窗口第一个子窗口搜索

     lpszClass: 子窗口的类名
     lpszWindow: 子窗口的窗口名

    (一般这两个值都是通过spy.exe来抓取到的);

    (3)返回值

    如果抓取到了,会返回子窗口的句柄HWND(实质是窗口的地址)

    如果抓取不到,返回NULL

    PS:这个函数只能搜索父窗口的直接子窗口,如果要搜索孙子或者其他后代窗口,就需要一层一层地调用这个函数

     

    3.SetWindowPos()  设置窗口的位置、大小和显示方式

    官方文档

    (1)语法:

    BOOL SetWindowPos(
      HWND hWnd,
      HWND hWndInsertAfter,
      int  X,
      int  Y,
      int  cx,
      int  cy,
      UINT uFlags
    );

    (2)参数解释

    hWnd:要设置的窗口句柄,可通过FindWindowA()或SPYSPY抓取

    hWndInsertAfter: 设置在Z轴的顺序,即和其他窗口间的遮盖关系。可以是一个具体的句柄也可以是预先定义的宏。详见文档(0是在最上层,1在最下层)

    X,Y:窗口左上角的坐标

    cx,cy:窗口的宽高

    uFlags:显示方式,详见文档,1代表正常显示(原始宽高,将忽略cx,cy的值)

    (3)返回值

    成功,返回一个非0整数

    失败,返回0

     

    更多相关内容
  • Python对Windows程序窗口的操作

    千次阅读 多人点赞 2021-10-25 15:36:23
    hwnd = win32gui.FindWindow(lpClassName=None, lpWindowName=None) # 查找窗口,不找子窗口,返回值为0表示未找到窗口 hwnd = win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=...

    Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。

    一,Python对Windows程序窗口操作,最大化,最小化,关闭

    import win32con
    import win32gui
    import time
    
    '''
    hwnd = win32gui.FindWindow(lpClassName=None, lpWindowName=None)  # 查找窗口,不找子窗口,返回值为0表示未找到窗口
    hwnd = win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)  # 查找子窗口,返回值为0表示未找到子窗口
    
    win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。
    SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。
    SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。
    SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。
    SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
    SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
    SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
    SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
    SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
    SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
    '''
    
    # 先等待3秒
    time.sleep(3)
    
    # 查找窗口句柄
    hwnd = win32gui.FindWindow("YodaoMainWndClass", u"网易有道词典")
    print(hwnd)
    
    if hwnd != 0:
        # 若最小化,则将其显示,反之则最小化
        if win32gui.IsIconic(hwnd):
            win32gui.ShowWindow(hwnd, win32con.SW_SHOWMAXIMIZED)
        else:
            win32gui.ShowWindow(hwnd, win32con.SW_SHOWMINIMIZED)
    
        win32gui.SetForegroundWindow(hwnd)  # 设置前置窗口
        # win32gui.SetFocus(hwnd)  # 设置聚焦窗口
    
        # 关闭窗口
        win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
    

    二,Python窗体操作函数

    实现了一个window下对窗体操作的类,实现的功能如:移动窗体、获取窗体位置和大小、截取窗体图片、坐标转换等。

    # coding=utf-8
    import win32con
    import win32api
    import win32gui
    import win32ui
    from ctypes import *
    from ctypes import wintypes
    
    GetForegroundWindow = windll.user32.GetForegroundWindow
    GetWindowRect = windll.user32.GetWindowRect
    SetForegroundWindow = windll.user32.SetForegroundWindow
    GetWindowText = windll.user32.GetWindowTextA
    MoveWindow = windll.user32.MoveWindow
    EnumWindows = windll.user32.EnumWindows
    
    class RECT(Structure):
        _fields_ = [
            ('left', c_long),
            ('top', c_long),
            ('right', c_long),
            ('bottom', c_long)
        ]
    
    
    class POINT(Structure):
        _fields_ = [
            ('x', c_long),
            ('y', c_long),
        ]
    
    
    class FormControl(object):
        def __init__(self):
            self.win_hd = None
            self.win_title = ''
    
        def bindActiveWindow(self):
            """
            函数功能:获取当前焦点所在窗口
            """
            self.win_hd = GetForegroundWindow()
    
        def bindWindowByName(self, win_name):
            """
            函数功能:根据窗体名获取窗体句柄
            """
            self.win_title = win_name
            pro_fun_type = CFUNCTYPE(c_bool, c_int, c_long)
            pro_fun_p = pro_fun_type(self.EnumWindowsProc)
            EnumWindows(pro_fun_p, None)
    
        def getWinRect(self):
            """
            函数功能:获取窗体的位置和大小
            """
            if self.win_hd is None:
                return None
            rect=RECT()
            GetWindowRect(self.win_hd,byref(rect))
            return rect
    
        def toScreenPos(self, x,y):
            """
            函数功能:将窗体内部坐标转换为相对于显示屏的绝对坐标
            """
            #未指定窗口,则结束函数
            if self.win_hd is None:
                return None
            rect=self.getWinRect()
            #指定的坐标不在窗体内,则结束函数
            if x < 0 or y < 0 or x > rect.right or y > rect.bottom:
                return None
            pos = POINT()
            pos.x = x + rect.left
            pos.y = y + rect.top
            return pos
    
        def toWindowPos(self,x,y):
            """
            函数功能:将绝对坐标转换成相对于窗体内部坐标
            """
            if self.win_hd is None:
                return None
            rect = self.getWinRect()
            pos = POINT()
            pos.x = x - rect.left
            pos.y = y - rect.top
            # 指定的坐标不在窗体内,则结束函数
            if pos.x < 0 or pos.y < 0 or pos.x > rect.right or pos.y > rect.bottom:
                return None
            return pos
    
        def WindowActive(self):
            """
            函数功能:将窗体置前
            """
            if self.win_hd is None:
                return None
            SetForegroundWindow(self.win_hd)
    
        def getHWND(self):
            return self.win_hd
    
        def getWinTitle(self):
            """
            函数功能:获取窗体的标题
            """
            if self.win_hd is None:
                return None
            buffer = create_string_buffer(255,'\0')
            GetWindowText(self.win_hd,buffer,255)
            value=buffer.value.decode('gbk')
            return value
    
        def MoveTo(self,x,y):
            """
            函数功能:移动窗体到指定坐标位置
            """
            if self.win_hd is None:
                return None
            rect = self.getWinRect()
            MoveWindow(self.win_hd,x,y,rect.right-rect.left,rect.bottom-rect.top,True)
    
        def WinCapture(self,path,x,y,w,h):
            """
            函数功能:抓取窗体截图,并保存到文件
            参    数:path 保存路径
                     x 截取起始x坐标(窗体内相对坐标)
                     y 截取起始y坐标(窗体内相对坐标)
                     w 截取宽度,为0则取窗体宽度
                     h 截取长度,为0则取窗体高度
            """
            if self.win_hd is None:
                return None
            rect = self.getWinRect()
            if w == 0:
                w = rect.right - rect.left
            if h == 0:
                h = rect.bottom - rect.top
            if x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:
                return None
            self.Capture(self.win_hd,path,x,y,w,h,0)
    
        def WinCapture_Mem(self,x,y,w,h):
            """
            函数功能:抓取窗体截图,并返回图像内存数据
            参    数:
                     x 截取起始x坐标(窗体内相对坐标)
                     y 截取起始y坐标(窗体内相对坐标)
                     w 截取宽度,为0则取窗体宽度
                     h 截取长度,为0则取窗体高度
            """
            if self.win_hd is None:
                return None
            rect = self.getWinRect()
            if w == 0:
                w = rect.right - rect.left
            if h == 0:
                h = rect.bottom - rect.top
            if x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:
                return None
            return self.Capture(self.win_hd,'',x,y,w,h,1)
    
        def Capture(self, hd, path, x, y, w, h, mode):
            """
            函数功能:截图
            参    数:hd 截取的窗口句柄
                    path 保存路径
                     x 截取起始x坐标(窗体内相对坐标)
                     y 截取起始y坐标(窗体内相对坐标)
                     w 截取宽度,为0则取窗体宽度
                     h 截取长度,为0则取窗体高度
                     mode 保存模式 0:保存为图片,1:返回图像字节数据
            """
            # 根据窗口句柄获取窗口的设备上下文
            hwndDC = win32gui.GetWindowDC(self.win_hd)
            # 根据窗口的DC获取memDC
            srcdc = win32ui.CreateDCFromHandle(hwndDC)
            # memDC创建可兼容的DC
            saveDC = srcdc.CreateCompatibleDC()
            # 创建bigmap准备保存图片
            saveBitMap = win32ui.CreateBitmap()
            # 为bitmap开辟空间
            saveBitMap.CreateCompatibleBitmap(srcdc, w, h)
            # 高度saveDC,将截图保存到saveBitmap中
            saveDC.SelectObject(saveBitMap)
            # 截取从左上角(0,0)长宽为(w,h)的图片
            saveDC.BitBlt((0, 0), (w, h), srcdc, (x, y), win32con.SRCCOPY)
            if mode == 0:
                saveBitMap.SaveBitmapFile(saveDC, path)
            else:
                signedIntsArray = saveBitMap.GetBitmapBits(True)
                return signedIntsArray
            # 释放内存
            srcdc.DeleteDC()
            saveDC.DeleteDC()
            win32gui.ReleaseDC(self.win_hd,hwndDC)
            win32gui.DeleteObject(saveBitMap.GetHandle())
    
    
        def EnumWindowsProc(self,hwnd, lParam):
            buffer = create_string_buffer(255,'\0')
            GetWindowText(hwnd,buffer,255)
            value=buffer.value.decode('gbk')
            if value == self.win_title:
                self.win_hd = hwnd
                print(self.win_hd)
                return  False
            return True
    

    三,Python pywin32 获取 windows 的窗体内文本框的内容

    用函数 win32gui.SendMessage 获取不了文本框的文本内容,用 str 类型的参数接收获取的内容的话没有获取到东西,而用 PyBuffer 类型去获取则得到类似于 16 进制的东西。

    from win32gui import *
    from win32api import *
    from win32process import *
    import win32con
    
    import time
    
    time.sleep(3)
    
    # 获取窗体句柄
    hWnd = GetForegroundWindow()
    print('hownd: ', hWnd)
    
    FormThreadID = GetCurrentThreadId()
    print('FormThreadID: ', FormThreadID)
    
    CWndThreadID = GetWindowThreadProcessId(hWnd)
    print('CWndThreadID: ', CWndThreadID)
    
    AttachThreadInput(CWndThreadID[0], FormThreadID, True)
    
    # 获取光标所在文本框句柄
    hWnd = GetFocus()
    print('hWnd: ', hWnd)
    
    AttachThreadInput(CWndThreadID[0], FormThreadID, False)
    
    # SendMessage(hWnd, win32con.WM_SETTEXT, 0, "mextb1860 第一个文本框")
    
    # 文本框内容长度
    length = SendMessage(hWnd, win32con.WM_GETTEXTLENGTH)+1
    print('Length: ', length)
    
    buf = '0'*length
    # 生成buffer对象
    # buf = PyMakeBuffer(length)
    
    # 获取文本框内容
    print('get: ', SendMessage(hWnd, win32con.WM_GETTEXT, length, buf))
    
    print('text: ', buf)
    

    四,Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。

    1. 通过类名和标题查找窗口句柄,并获得窗口位置和大小
    import <span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32gui/" title="View all posts in win32gui" target="_blank">win32gui</a></span>
    import <span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32api/" title="View all posts in win32api" target="_blank">win32api</a></span>
    classname = "MozillaWindowClass"
    titlename = "百度一下,你就知道 - Mozilla Firefox"
    #获取句柄
    hwnd = <span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32gui/" title="View all posts in win32gui" target="_blank">win32gui</a></span>.FindWindow(classname, titlename)
    #获取窗口左上角和右下角坐标
    left, top, right, bottom = win32gui.GetWindowRect(hwnd)
    
    1. 通过父句柄获取子句柄
    def get_child_windows(parent):        
        '''     
        获得parent的所有子窗口句柄
         返回子窗口句柄列表
         '''     
        if not parent:         
            return      
        hwndChildList = []     
        win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd),  hwndChildList)          
        return hwndChildList 
    #获取某个句柄的类名和标题
    title = win32gui.GetWindowText(hwnd)     
    clsname = win32gui.GetClassName(hwnd)     
    #获取父句柄hwnd类名为clsname的子句柄
    hwnd1= win32gui.FindWindowEx(hwnd, None, clsname, None)
    
    1. 鼠标定位与点击
    #鼠标定位到(30,50)
    <span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32api/" title="View all posts in win32api" target="_blank">win32api</a></span>.SetCursorPos([30,150])
    #执行左单键击,若需要双击则延时几毫秒再点击一次即可
    win32api.mouse_event(<span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32con/" title="View all posts in win32con" target="_blank">win32con</a></span>.MOUSEEVENTF_LEFTUP | <span class="wp_keywordlink_affiliate"><a href="http://www.lanqibing.com/tag/win32con/" title="View all posts in win32con" target="_blank">win32con</a></span>.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    #右键单击
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    
    1. 发送回车键
    win32api.keybd_event(13,0,0,0)
    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
    
    1. 关闭窗口
    win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)
    
    一, 首先import win32gui, win32con
    二, 使用win32gui.FindWindow找到目标程序:
    win = win32gui.FindWindow(None, ‘User Login’)
    三, 使用win32gui.FindWindowEx找到目标文本框:
    tid = win32gui.FindWindowEx(win, None, ‘Edit’, None)
    四, 使用win32gui.SendMessage发送文本到目标文本框:
    win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello’)
    
    当然了,可以继续找到下一个文本框:
    username = win32gui.FindWindowEx(win, tid, ‘Edit’, None)
    
    更新:已经找到发送回车的方法:
    win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello’)
    win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
    win32gui.PostMessage(tid, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
    

    实例:

    import win32gui
    import win32con
    import win32api
    
    # 从顶层窗口向下搜索主窗口,无法搜索子窗口
    # FindWindow(lpClassName=None, lpWindowName=None)  窗口类名 窗口标题名
    handle = win32gui.FindWindow("Notepad", None) 
    
    
    # 获取窗口位置
    left, top, right, bottom = win32gui.GetWindowRect(handle)
    #获取某个句柄的类名和标题
    title = win32gui.GetWindowText(handle)     
    clsname = win32gui.GetClassName(handle)
    
    # 打印句柄
    # 十进制
    print(handle)
    # 十六进制
    print("%x" %(handle) )
    
    
    # 搜索子窗口
    # 枚举子窗口
    hwndChildList = []     
    win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd),  hwndChildList)
    
    # FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 父窗口句柄 若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。 子窗口类名 子窗口标题
    subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)
    
    # 获得窗口的菜单句柄
    menuHandle = win32gui.GetMenu(subHandle)
    # 获得子菜单或下拉菜单句柄   
    # 参数:菜单句柄 子菜单索引号
    subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)
    # 获得菜单项中的的标志符,注意,分隔符是被编入索引的  
    # 参数:子菜单句柄 项目索引号 
    menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)
    # 发送消息,加入消息队列,无返回 
    # 参数:句柄 消息类型 WParam IParam
    win32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0)
    
    
    # wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位。
    # 当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。
    # 这种时候在python里记得用把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。
    
    # 下选框内容更改
    # 参数:下选框句柄; 消息内容; 参数下选框的哪一个item,以0起始的待选选项的索引;如果该值为-1,将从组合框列表中删除当前选项,并使当前选项为空; 参数
    # CB_Handle为下选框句柄,PCB_handle下选框父窗口句柄
    if win32api.SendMessage(CB_handle, win32con.CB_SETCURSEL, 1, 0) == 1:
    # 下选框的父窗口命令
    # 参数:父窗口句柄; 命令; 参数:WParam:高位表示类型,低位表示内容;参数IParam,下选框句柄
    # CBN_SELENDOK当用户选择了有效的列表项时发送,提示父窗体处理用户的选择。 LOWORD为组合框的ID. HIWORD为CBN_SELENDOK的值。
                win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle) 
    # CBN_SELCHANGE当用户更改了列表项的选择时发送,不论用户是通过鼠标选择或是通过方向键选择都会发送此通知。LOWORD为组合框的ID. HIWORD为CBN_SELCHANGE的值。
                win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle) 
    
    
    # 设置文本框内容,等窗口处理完毕后返回true。中文需编码成gbk 
    # 参数:句柄;消息类型;参数WParam,无需使用; 参数IParam,要设置的内容,字符串
    win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode('gbk'))
    
    
    # 控件点击确定,处理消息后返回0
    # 参数:窗口句柄; 消息类型; 参数WParam HIWORD为0(未使用),LOWORD为控件的ID; 参数IParam  0(未使用),确定控件的句柄
    win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle)
    
    
    # 获取窗口文本不含截尾空字符的长度
    # 参数:窗口句柄; 消息类型; 参数WParam; 参数IParam
    bufSize = win32api.SendMessage(subHandle, win32con.WM_GETTEXTLENGTH, 0, 0) +1
    # 利用api生成Buffer
    strBuf = win32gui.PyMakeBuffer(bufSize)
    print(strBuf)
    # 发送消息获取文本内容
    # 参数:窗口句柄; 消息类型;文本大小; 存储位置
    length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf)
    # 反向内容,转为字符串
    # text = str(strBuf[:-1])
    
    address, length = win32gui.PyGetBufferAddressAndLen(strBuf) 
    text = win32gui.PyGetString(address, length) 
    # print('text: ', text)
    
    # 鼠标单击事件
    #鼠标定位到(30,50)
    win32api.SetCursorPos([30,150])
    #执行左单键击,若需要双击则延时几毫秒再点击一次即可
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    #右键单击
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    
    def click1(x,y):                #第一种
        win32api.SetCursorPos((x,y))
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
    
    def click2(x,y):               #第二种
        ctypes.windll.user32.SetCursorPos(x,y)
        ctypes.windll.user32.mouse_event(2,0,0,0,0)
        ctypes.windll.user32.mouse_event(4,0,0,0,0)
    
    def click_it(pos):          #第三种
        handle= win32gui.WindowFromPoint(pos)
        client_pos =win32gui.ScreenToClient(handle,pos)
        tmp=win32api.MAKELONG(client_pos[0],client_pos[1])
        win32gui.SendMessage(handle, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
        win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)
        win32gui.SendMessage(handle, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp)
    
    # 发送回车
    win32api.keybd_event(13,0,0,0)
    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
    
    
    # 关闭窗口
    win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)
    
    
    # 检查窗口是否最小化,如果是最大化
    if(win32gui.IsIconic(hwnd)):
    #     win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
        win32gui.ShowWindow(hwnd, 8)
        sleep(0.5)
    
    # SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。
    # SW_MAXIMIZE:最大化指定的窗口。nCmdShow=3。
    # SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
    # SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
    # SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
    # SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
    # SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。
    # SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。
    # SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
    # SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
    # SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
    # SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。
    
    
    # win32虽然也可控制键盘,但不如使用PyUserInput的方便。需要注意在windows和mac下接口参数可能有所不同。
    from pymouse import PyMouse
    from pykeyboard import PyKeyboard
    m = PyMouse()
    k = PyKeyboard()
    
    x_dim, y_dim = m.screen_size()
    # 鼠标点击
    m.click(x_dim/2, y_dim/2, 1)
    # 键盘输入
    k.type_string('Hello, World!')
    
    # 按住一个键
    k.press_key('H')
    # 松开一个键
    k.release_key('H')
    # 按住并松开,tap一个键
    k.tap_key('e')
    # tap支持重复的间歇点击键
    k.tap_key('l',n=2,interval=5) 
    # 发送判断文字
    k.type_string('123456')
    
    #创建组合键
    k.press_key(k.alt_key)
    k.tap_key(k.tab_key)
    k.release_key(k.alt_key)
    # 特殊功能键
    k.tap_key(k.function_keys[5]) # Tap F5
    k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad
    k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice
    
    # Mac系统
    k.press_keys(['Command','shift','3'])
    # Windows系统
    k.press_keys([k.windows_l_key,'d'])
    
    其中的PyMouseEvent和PyKeyboardEvent还可用于监听鼠标和键盘事件的输入
    
    展开全文
  • 文章目录一、前言二、使用Spy++工具分析窗口三、C#通过Windows API捕获窗口,获取窗口文本四、附录:Windows窗口消息 一、前言 项目是Unity开发的,上架了QQ游戏大厅,需要兼容XP系统。 QQ游戏大厅启动游戏的流程是...

    一、前言

    项目是Unity开发的,上架了QQ游戏大厅,需要兼容XP系统。
    QQ游戏大厅启动游戏的流程是这样:
    1 QQ游戏大厅.exe -------> 2 下载器.exe -------> 3 Unity游戏.exe
    XP中测试的时候,Unity游戏.exe运行时报了如下的Error
    在这里插入图片描述
    那么,我们不确定有多少用户遇到了这个问题,所以需要进行数据上报,在下载器中加上逻辑检测,当下载器去启动Unity游戏的时候,等待2秒,判断是否有Error窗口,如果有,则捕获这个窗口并取出里面的文本,上报给服务器,方便数据分析统计。

    下载器我是用C#.Net Framework桌面应用做的,所以这里就涉及到如何在C#中捕获Windows窗口的问题,下面就介绍一下我的实现方法。

    二、使用Spy++工具分析窗口

    我们可以使用Spy++工具分析一下窗口。这里我用的是Spy++ Lite,只有几百K大小,非常轻便。
    在这里插入图片描述

    Spy++ Lite下载:
    https://pan.baidu.com/s/1Iah1TyWo6dUv8cHSMcvBLg
    提取码:mtsq

    Spy++ Lite是一款功能丰富的编程辅助工具,适用于获取窗口句柄并分析窗体结构。可以探测32位和64位应用程序。可以以十六进制和十进制显示窗口句柄、窗口样式和类样式等数值。可以获取父窗口和兄弟窗口、子窗口结构并形成句柄树,还可以调节窗口的状态和行为,获取程序路径、给窗口截图等。软件还支持获取列表控件数据,如任务管理器、股票行情数据等,还支持获取树视图、下拉框、列表框和菜单数据和字体信息等。

    注意,.OCX文件需要注册,注册.OCX文件步骤:
    (1) 将COMCTL32.OCX文件拷贝到C盘下面这个目录中:32位系统:c:\WINDOWS\system32;64位系统:c:\Windows\SysWOW64
    如下,因为我是32位 XP,所以放在c:\WINDOWS\system32中。
    在这里插入图片描述
    (2)打开运行,输入注册命令,
    32位系统:

    regsvr32 c:\WINDOWS\system32\COMCTL32.OCX
    

    64位系统:

    regsvr32 c:\Windows\SysWOW64\COMCTL32.OCX
    

    注册成功。
    在这里插入图片描述
    接下来就可以运行Spy++ Lite了。
    在这里插入图片描述
    使用Spy++分析Error窗口的信息。
    在这里插入图片描述
    根据上面的操作,我们可以知道:
    窗口标题是Error,这个窗口下有一个子窗口,子窗口标题为Edit,子窗口中的文本为:

    Failed to initialize Direct3D.
    Make sure you have at least DirectX 9.0c installed, have drivers for your
    graphics card and have not disabled 3D acceleration
    in display settings.
    InitializeEngineGraphics failed
    

    我们要做的,就是找到这个子窗口,取出文本,下面就是C#代码来实现这个逻辑了。

    三、C#通过Windows API捕获窗口,获取窗口文本

    Windows封装了很多API,我们可以通过这些API来访问窗口和操作窗口。
    其中用到了几个API

    // 查找窗口
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
    // 遍历窗口的所有子窗口,通过CallBack回调
    [DllImport("user32.dll")]
    public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
    public delegate bool CallBack(IntPtr hwnd, int lParam);
    
    // 获取窗口的类名
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
    
    // 判断窗口是否可见
    [DllImport("user32.dll")]
    public static extern bool IsWindowVisible(IntPtr hWnd);
    
    // 获取窗口文本长度
    [DllImport("user32.dll")]
    public static extern int GetWindowTextLength(IntPtr hWnd);
    
    // 获取窗口文本,文本会塞入StringBuilder中,需要指明字符串最大长度nMaxCount
    [DllImport("User32.dll", EntryPoint = "GetWindowText")]
    private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount);
    
    // 给窗口发送消息
    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    
    // 给窗口发送消息,事件返回的数据通过Byte[]数组获得
    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, Byte[] lParam);
    

    完整代码如下:

    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    
    
    public partial class WindowApiHelper 
    {
        /// <summary>
        /// 尝试查找Error窗口并取出窗口文本
        /// </summary>
        /// <returns></returns>
        public static string TryFindErrorWindowText()
        {
            string errorText = "";
            // 查找标题为Error的窗口
            IntPtr mainHandle = FindWindow(null, "Error");
            if (mainHandle != IntPtr.Zero)
            {
                // 枚举子窗体,查找控件句柄
                int i = EnumChildWindows(mainHandle, (h, l) =>
                {
                    StringBuilder sbr = new StringBuilder();
                    GetClassName(h, sbr, 255);
                    string classname = sbr.ToString();
                    // 获取Edit子窗口
                    if ("Edit" == classname)
                    {
                        // 是否可见
                        if (IsWindowVisible(h))
                        {
                            // 取出窗口文本
                            int textLen;
                            textLen = SendMessage(h, WM_GETTEXTLENGTH, 0, 0);
                            Byte[] byt = new Byte[textLen];
                            SendMessage(h, WM_GETTEXT, textLen + 1, byt);
                            errorText = Encoding.Default.GetString(byt);
                            // 关闭Error窗口
                            // SendMessage(h, WM_CLOSE , 0, 0);
                        }
                    }
    
                    return true;
                }, 0);
            }
            return errorText;
        }
    
        /*--Windows API------------------------------------------------------------------------------------*/
    
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
        [DllImport("user32.dll")]
        public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
        public delegate bool CallBack(IntPtr hwnd, int lParam);
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
    
        [DllImport("user32.dll")]
        public static extern bool IsWindowVisible(IntPtr hWnd);
    
        [DllImport("user32.dll")]
        public static extern int GetWindowTextLength(IntPtr hWnd);
    
        [DllImport("User32.dll", EntryPoint = "GetWindowText")]
        private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount);
    
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, Byte[] lParam);
    
        const int WM_GETTEXT = 0x000D;
        const int WM_GETTEXTLENGTH = 0x000E;
        const int WM_CLOSE = 0x10;
    
        /*--Windows API------------------------------------------------------------------------------------*/
    }
    

    四、附录:Windows窗口消息

    消息描述
    WM_CREATE = 0x0001;应用程序创建一个窗口
    WM_DESTROY = 0x0002;一个窗口被销毁
    WM_MOVE = 0x0003;移动一个窗口
    WM_SIZE = 0x0005;改变一个窗口的大小
    WM_ACTIVATE = 0x0006;一个窗口被激活或失去激活状态;
    WM_SETFOCUS = 0x0007;获得焦点后
    WM_KILLFOCUS = 0x0008;失去焦点
    WM_ENABLE = 0x000A;改变enable状态
    WM_SETREDRAW = 0x000B;设置窗口是否能重画
    WM_SETTEXT = 0x000C;应用程序发送此消息来设置一个窗口的文本
    WM_GETTEXT = 0x000D;应用程序发送此消息来复制对应窗口的文本到缓冲区
    WM_GETTEXTLENGTH = 0x000E;得到与一个窗口有关的文本的长度(不包含空字符)
    WM_PAINT = 0x000F;要求一个窗口重画自己
    WM_CLOSE = 0x0010;当一个窗口或应用程序要关闭时发送一个信号
    WM_QUERYENDSESSION = 0x0011;当用户选择结束对话框或程序自己调用ExitWindows函数
    WM_QUIT = 0x0012;用来结束程序运行或当程序调用postquitmessage函数
    WM_QUERYOPEN = 0x0013;当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
    WM_ERASEBKGND = 0x0014;当窗口背景必须被擦除时(例在窗口改变大小时)
    WM_SYSCOLORCHANGE = 0x0015;当系统颜色改变时,发送此消息给所有顶级窗口
    WM_ENDSESSION = 0x0016;当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
    WM_SHOWWINDOW = 0x0018;当隐藏或显示窗口是发送此消息给这个窗口
    WM_ACTIVATEAPP = 0x001C;发此消息给应用程序哪个窗口是激活的,哪个是非激活的
    WM_FONTCHANGE = 0x001D;当系统的字体资源库变化时发送此消息给所有顶级窗口
    WM_TIMECHANGE = 0x001E;当系统的时间变化时发送此消息给所有顶级窗口
    WM_CANCELMODE = 0x001F;发送此消息来取消某种正在进行的摸态(操作)
    WM_SETCURSOR = 0x0020;如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
    WM_MOUSEACTIVATE = 0x0021;当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
    WM_CHILDACTIVATE = 0x0022;发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
    WM_QUEUESYNC = 0x0023;此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
    WM_GETMINMAXINFO = 0x0024;此消息发送给窗口当它将要改变大小或位置;
    WM_PAINTICON = 0x0026;发送给最小化窗口当它图标将要被重画
    WM_ICONERASEBKGND = 0x0027;此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
    WM_NEXTDLGCTL = 0x0028;发送此消息给一个对话框程序去更改焦点位置
    WM_SPOOLERSTATUS = 0x002A;每当打印管理列队增加或减少一条作业时发出此消息
    WM_DRAWITEM = 0x002B;当button,combobox,listbox,menu的可视外观改变时发送此消息给这些空件的所有者
    WM_MEASUREITEM = 0x002C;当button, combo box, list box, list view control, or menu item 被创建时发送此消息给控件的所有者
    WM_DELETEITEM = 0x002D;当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
    WM_VKEYTOITEM = 0x002E;此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
    WM_CHARTOITEM = 0x002F;此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
    WM_SETFONT = 0x0030;当绘制文本时程序发送此消息得到控件要用的颜色
    WM_GETFONT = 0x0031;应用程序发送此消息得到当前控件绘制文本的字体
    WM_SETHOTKEY = 0x0032;应用程序发送此消息让一个窗口与一个热键相关连
    WM_GETHOTKEY = 0x0033;应用程序发送此消息来判断热键与某个窗口是否有关联
    WM_QUERYDRAGICON = 0x0037;此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
    WM_COMPAREITEM = 0x0039;发送此消息来判定combobox或listbox新增加的项的相对位置
    WM_COMPACTING = 0x0041;显示内存已经很少了
    WM_WINDOWPOSCHANGING = 0x0046;发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
    WM_WINDOWPOSCHANGED = 0x0047;发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
    WM_POWER = 0x0048;(适用于16位的windows)当系统将要进入暂停状态时发送此消息
    WM_COPYDATA = 0x004A;当一个应用程序传递数据给另一个应用程序时发送此消息
    WM_CANCELJOURNAL = 0x004B;当某个用户取消程序日志激活状态,提交此消息给程序
    WM_NOTIFY = 0x004E;当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
    WM_INPUTLANGCHANGEREQUEST = 0x0050;当用户选择某种输入语言,或输入语言的热键改变
    WM_INPUTLANGCHANGE = 0x0051;当平台现场已经被改变后发送此消息给受影响的最顶级窗口
    WM_TCARD = 0x0052;当程序已经初始化windows帮助例程时发送此消息给应用程序
    WM_HELP = 0x0053;此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
    WM_USERCHANGED = 0x0054;当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息;
    WM_NOTIFYFORMAT = 0x0055;公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
    WM_CONTEXTMENU = 0x007B;当用户某个窗口中点击了一下右键就发送此消息给这个窗口
    WM_STYLECHANGING = 0x007C;当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
    WM_STYLECHANGED = 0x007D;当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
    WM_DISPLAYCHANGE = 0x007E;当显示器的分辨率改变后发送此消息给所有的窗口
    WM_GETICON = 0x007F;此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;
    WM_SETICON = 0x0080;程序发送此消息让一个新的大图标或小图标与某个窗口关联;
    WM_NCCREATE = 0x0081;当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;
    WM_NCDESTROY = 0x0082;此消息通知某个窗口,非客户区正在销毁
    WM_NCCALCSIZE = 0x0083;当某个窗口的客户区域必须被核算时发送此消息
    WM_NCHITTEST = 0x0084;移动鼠标,按住或释放鼠标时发生
    WM_NCPAINT = 0x0085;程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;
    WM_NCACTIVATE = 0x0086;此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态;
    WM_GETDLGCODE = 0x0087;发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件,通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它
    WM_NCMOUSEMOVE = 0x00A0;当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗的边框体
    WM_NCLBUTTONDOWN = 0x00A1;当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
    WM_NCLBUTTONUP = 0x00A2;当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;
    WM_NCLBUTTONDBLCLK = 0x00A3;当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
    WM_NCRBUTTONDOWN = 0x00A4;当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
    WM_NCRBUTTONUP = 0x00A5;当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
    WM_NCRBUTTONDBLCLK = 0x00A6;当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
    WM_NCMBUTTONDOWN = 0x00A7;当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_NCMBUTTONUP = 0x00A8;当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_NCMBUTTONDBLCLK = 0x00A9;当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_KEYDOWN = 0x0100;按下一个键
    WM_KEYUP = 0x0101;释放一个键
    WM_CHAR = 0x0102;按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
    WM_DEADCHAR = 0x0103;当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口
    WM_SYSKEYDOWN = 0x0104;当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口;
    WM_SYSKEYUP = 0x0105;当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
    WM_SYSCHAR = 0x0106;当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
    WM_SYSDEADCHAR = 0x0107;当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
    WM_INITDIALOG = 0x0110;在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
    WM_COMMAND = 0x0111;当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
    WM_SYSCOMMAND = 0x0112;当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
    WM_TIMER = 0x0113;发生了定时器事件
    WM_HSCROLL = 0x0114;当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
    WM_VSCROLL = 0x0115;当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
    WM_INITMENU = 0x0116;当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
    WM_INITMENUPOPUP = 0x0117;当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
    WM_MENUSELECT = 0x011F;当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
    WM_MENUCHAR = 0x0120;当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;
    WM_ENTERIDLE = 0x0121;当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
    WM_CTLCOLORMSGBOX = 0x0132;在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
    WM_CTLCOLOREDIT = 0x0133;当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
    WM_CTLCOLORLISTBOX = 0x0134;当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
    WM_CTLCOLORBTN = 0x0135;当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
    WM_CTLCOLORDLG = 0x0136;当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
    WM_CTLCOLORSCROLLBAR= 0x0137;当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
    WM_CTLCOLORSTATIC = 0x0138;当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
    WM_MOUSEMOVE = 0x0200;移动鼠标
    WM_LBUTTONDOWN = 0x0201;按下鼠标左键
    WM_LBUTTONUP = 0x0202;释放鼠标左键
    WM_LBUTTONDBLCLK = 0x0203;双击鼠标左键
    WM_RBUTTONDOWN = 0x0204;按下鼠标右键
    WM_RBUTTONUP = 0x0205;释放鼠标右键
    WM_RBUTTONDBLCLK = 0x0206;双击鼠标右键
    WM_MBUTTONDOWN = 0x0207;按下鼠标中键
    WM_MBUTTONUP = 0x0208;释放鼠标中键
    WM_MBUTTONDBLCLK = 0x0209;双击鼠标中键
    WM_MOUSEWHEEL = 0x020A;当鼠标轮子转动时发送此消息个当前有焦点的控件
    WM_PARENTNOTIFY = 0x0210;当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
    WM_ENTERMENULOOP = 0x0211;发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
    WM_EXITMENULOOP = 0x0212;发送此消息通知应用程序的主窗口that已退出了菜单循环模式
    WM_SIZING = 532;当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们
    WM_CAPTURECHANGED = 533;发送此消息 给窗口当它失去捕获的鼠标时;
    WM_MOVING = 534;当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们;
    WM_POWERBROADCAST = 536;此消息发送给应用程序来通知它有关电源管理事件;
    WM_DEVICECHANGE = 537;当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
    WM_MDICREATE = 0x0220;应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口
    WM_MDIDESTROY = 0x0221;应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口

    五、Windows API大全

    1、API之网络函数

    windows api描述
    WNetAddConnection创建同一个网络资源的永久性连接
    WNetAddConnection2创建同一个网络资源的连接
    WNetAddConnection3创建同一个网络资源的连接
    WNetCancelConnection结束一个网络连接
    WNetCancelConnection2结束一个网络连接
    WNetCloseEnum结束一次枚举操作
    WNetConnectionDialog启动一个标准对话框,以便建立同网络资源的连接
    WNetDisconnectDialog启动一个标准对话框,以便断开同网络资源的连接
    WNetEnumResource枚举网络资源
    WNetGetConnection获取本地或已连接的一个资源的网络名称
    WNetGetLastError获取网络错误的扩展错误信息
    WNetGetUniversalName获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
    WNetGetUser获取一个网络资源用以连接的名字
    WNetOpenEnum启动对网络资源进行枚举的过程

    2、API之消息函数

    windows api描述
    BroadcastSystemMessage将一条系统消息广播给系统中所有的顶级窗口
    GetMessagePos取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置
    GetMessageTime取得消息队列中上一条消息处理完毕时的时间
    PostMessage将一条消息投递到指定窗口的消息队列
    PostThreadMessage将一条消息投递给应用程序
    RegisterWindowMessage获取分配给一个字串标识符的消息编号
    ReplyMessage答复一个消息
    SendMessage调用一个窗口的窗口函数,将一条消息发给那个窗口
    SendMessageCallback将一条消息发给窗口
    SendMessageTimeout向窗口发送一条消息
    SendNotifyMessage向窗口发送一条消息

    3、API之文件处理函数

    windows api描述
    CloseHandle关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等
    CompareFileTime对比两个文件的时间
    CopyFile复制文件
    CreateDirectory创建一个新目录
    CreateFile打开和创建文件、管道、邮槽、通信服务、设备以及控制台
    CreateFileMapping创建一个新的文件映射对象
    DeleteFile删除指定文件
    DeviceIoControl对设备执行指定的操作
    DosDateTimeToFileTime将DOS日期和时间值转换成一个 win32 FILETIME 值
    FileTimeToDosDateTime将一个 win32 FILETIME 值转换成DOS日期和时间值
    FileTimeToLocalFileTime将一个FILETIME结构转换成本地时间
    FileTimeToSystemTime根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构
    FindClose关闭由FindFirstFile函数创建的一个搜索句柄
    FindFirstFile根据文件名查找文件
    FindNextFile根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
    FlushFileBuffers针对指定的文件句柄,刷新内部文件缓冲区
    FlushViewOfFile将写入文件映射缓冲区的所有数据都刷新到磁盘
    GetBinaryType判断文件是否可以执行
    GetCompressedFileSize判断一个压缩文件在磁盘上实际占据的字节数
    GetCurrentDirectory在一个缓冲区中装载当前目录
    GetDiskFreeSpace获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
    GetDiskFreeSpaceEx获取与一个磁盘的组织以及剩余空间容量有关的信息
    GetDriveType判断一个磁盘驱动器的类型
    GetExpandedName取得一个压缩文件的全名
    GetFileAttributes判断指定文件的属性
    GetFileInformationByHandle这个函数提供了获取文件信息的一种机制
    GetFileSize判断文件长度
    GetFileTime取得指定文件的时间信息
    GetFileType在给出文件句柄的前提下,判断文件类型
    GetFileVersionInfo从支持版本标记的一个模块里获取文件版本信息
    GetFileVersionInfoSize针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区
    GetFullPathName获取指定文件的完整路径名
    GetLogicalDrives判断系统中存在哪些逻辑驱动器字母
    GetLogicalDriveStrings获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
    GetOverlappedResult判断一个重叠操作当前的状态
    GetPrivateProfileInt为初始化文件(.ini文件)中指定的条目获取一个整数值
    GetPrivateProfileSection获取指定小节(在.ini文件中)所有项名和值的一个列表
    GetPrivateProfileString为初始化文件中指定的条目取得字串
    GetProfileInt取得win.ini初始化文件中指定条目的一个整数值
    GetProfileSection获取指定小节(在win.ini文件中)所有项名和值的一个列表
    GetProfileString为win.ini初始化文件中指定的条目取得字串
    GetShortPathName获取指定文件的短路径名
    GetSystemDirectory取得Windows系统目录(即System目录)的完整路径名
    GetTempFileName这个函数包含了一个临时文件的名字,它可由应用程序使用
    GetTempPath获取为临时文件指定的路径
    GetVolumeInformation获取与一个磁盘卷有关的信息
    GetWindowsDirectory获取Windows目录的完整路径名
    hread参考lread
    hwrite参考lwrite函数
    lclose关闭指定的文件
    lcreat创建一个文件
    llseek设置文件中进行读写的当前位置
    LockFile锁定文件的某一部分,使其不与其他应用程序共享
    LockFileEx与LockFile相似,只是它提供了更多的功能
    lopen以二进制模式打开指定的文件
    lread将文件中的数据读入内存缓冲区
    lwrite将数据从内存缓冲区写入一个文件
    LZClose关闭由LZOpenFile 或 LZInit函数打开的一个文件
    LZCopy复制一个文件
    LZInit这个函数用于初始化内部缓冲区
    LZOpenFile该函数能执行大量不同的文件处理,而且兼容于压缩文件
    LZRead将数据从文件读入内存缓冲区
    LZSeek设置一个文件中进行读写的当前位置
    MapViewOfFile将一个文件映射对象映射到当前应用程序的地址空间
    MoveFile移动文件
    OpenFile这个函数能执行大量不同的文件操作
    OpenFileMapping打开一个现成的文件映射对象
    QueryDosDevice在Windows NT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况
    ReadFile从文件中读出数据
    ReadFileEx与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
    RegCloseKey关闭系统注册表中的一个项(或键)
    RegConnectRegistry访问远程系统的部分注册表
    RegCreateKey在指定的项下创建或打开一个项
    RegCreateKeyEx在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数
    RegDeleteKey删除现有项下方一个指定的子项
    RegDeleteValue删除指定项下方的一个值
    RegEnumKey枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx
    RegEnumKeyEx枚举指定项下方的子项
    RegEnumValue枚举指定项的值
    RegFlushKey将对项和它的子项作出的改动实际写入磁盘
    RegGetKeySecurity获取与一个注册表项有关的安全信息
    RegLoadKey从以前用RegSaveKey函数创建的一个文件里装载注册表信息
    RegNotifyChangeKeyValue注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制
    RegOpenKey打开一个现有的注册表项
    RegOpenKeyEx打开一个现有的项。在win32下推荐使用这个函数
    RegQueryInfoKey获取与一个项有关的信息
    RegQueryValue取得指定项或子项的默认(未命名)值
    RegQueryValueEx获取一个项的设置值
    RegReplaceKey用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息
    RegRestoreKey从一个磁盘文件恢复注册表信息
    RegSaveKey将一个项以及它的所有子项都保存到一个磁盘文件
    RegSetKeySecurity设置指定项的安全特性
    RegSetValue设置指定项或子项的默认值
    RegSetValueEx设置指定项的值
    RegUnLoadKey卸载指定的项以及它的所有子项
    RemoveDirectory删除指定目录
    SearchPath查找指定文件
    SetCurrentDirectory设置当前目录
    SetEndOfFile针对一个打开的文件,将当前文件位置设为文件末尾
    SetFileAttributes设置文件属性
    SetFilePointer在一个文件中设置当前的读写位置
    SetFileTime设置文件的创建、访问及上次修改时间
    SetHandleCount这个函数不必在win32下使用;即使使用,也不会有任何效果
    SetVolumeLabel设置一个磁盘的卷标(Label)
    SystemTimeToFileTime根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构
    UnlockFile解除对一个文件的锁定
    UnlockFileEx解除对一个文件的锁定
    UnmapViewOfFile在当前应用程序的内存地址空间解除对一个文件映射对象的映射
    VerFindFile用这个函数决定一个文件应安装到哪里
    VerInstallFile用这个函数安装一个文件
    VerLanguageName这个函数能根据16位语言代码获取一种语言的名称
    VerQueryValue这个函数用于从版本资源中获取信息
    WriteFile将数据写入一个文件
    WriteFileEx与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调
    WritePrivateProfileSection为一个初始化文件(.ini)中指定的小节设置所有项名和值
    WritePrivateProfileString在初始化文件指定小节内设置一个字串
    WriteProfileSection为Win.ini初始化文件中一个指定的小节设置所有项名和值
    WriteProfileString在Win.ini初始化文件指定小节内设置一个字串

    4、API之打印函数

    windows api描述
    AbortDoc取消一份文档的打印
    AbortPrinter删除与一台打印机关联在一起的缓冲文件
    AddForm为打印机的表单列表添加一个新表单
    AddJob用于获取一个有效的路径名,以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号
    AddMonitor为系统添加一个打印机监视器
    AddPort启动“添加端口”对话框,允许用户在系统可用端口列表中加入一个新端口
    AddPrinter在系统中添加一台新打印机
    AddPrinterConnection连接指定的打印机
    AddPrinterDriver为指定的系统添加一个打印驱动程序
    AddPrintProcessor为指定的系统添加一个打印处理器
    AddPrintProvidor为系统添加一个打印供应商
    AdvancedDocumentProperties启动打印机文档设置对话框
    ClosePrinter关闭一个打开的打印机对象
    ConfigurePort针对指定的端口,启动一个端口配置对话框
    ConnectToPrinterDlg启动连接打印机对话框,用它同访问网络的打印机连接
    DeleteForm从打印机可用表单列表中删除一个表单
    DeleteMonitor删除指定的打印监视器
    DeletePort启动“删除端口”对话框,允许用户从当前系统删除一个端口
    DeletePrinter将指定的打印机标志为从系统中删除
    DeletePrinterConnection删除与指定打印机的连接
    DeletePrinterDriver从系统删除一个打印机驱动程序
    DeletePrintProcessor从指定系统删除一个打印处理器
    DeletePrintProvidor从系统中删除一个打印供应商
    DeviceCapabilities利用这个函数可获得与一个设备的能力有关的信息
    DocumentProperties打印机配置控制函数
    EndDocAPI结束一个成功的打印作业
    EndDocPrinter在后台打印程序的级别指定一个文档的结束
    EndPage用这个函数完成一个页面的打印,并准备设备场景,以便打印下一个页
    EndPagePrinter指定一个页在打印作业中的结尾
    EnumForms枚举一台打印机可用的表单
    EnumJobs枚举打印队列中的作业
    EnumMonitors枚举可用的打印监视器
    EnumPorts枚举一个系统可用的端口
    EnumPrinterDrivers枚举指定系统中已安装的打印机驱动程序
    EnumPrinters枚举系统中安装的打印机
    EnumPrintProcessorDatatypes枚举由一个打印处理器支持的数据类型
    EnumPrintProcessors枚举系统中可用的打印处理器
    Escape设备控制函数
    FindClosePrinterChangeNotification关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象
    FindFirstPrinterChangeNotification创建一个新的改变通告对象,以便我们注意打印机状态的各种变化
    FindNextPrinterChangeNotification用这个函数判断触发一次打印机改变通告信号的原因
    FreePrinterNotifyInfo释放由FindNextPrinterChangeNotification函数分配的一个缓冲区
    GetForm取得与指定表单有关的信息
    GetJob获取与指定作业有关的信息
    GetPrinter取得与指定打印机有关的信息
    GetPrinterData为打印机设置注册表配置信息
    GetPrinterDriver针对指定的打印机,获取与打印机驱动程序有关的信息
    GetPrinterDriverDirectory判断指定系统中包含了打印机驱动程序的目录是什么
    GetPrintProcessorDirectory判断指定系统中包含了打印机处理器驱动程序及文件的目录
    OpenPrinter打开指定的打印机,并获取打印机的句柄
    PrinterMessageBox在拥有指定打印作业的系统上显示一个打印机出错消息框
    PrinterProperties启动打印机属性对话框,以便对打印机进行配置
    ReadPrinter从打印机读入数据
    ResetDC重设一个设备场景
    ResetPrinter改变指定打印机的默认数据类型及文档设置
    ScheduleJob提交一个要打印的作业
    SetAbortProc为Windows指定取消函数的地址
    SetForm为指定的表单设置信息
    SetJob对一个打印作业的状态进行控制
    SetPrinter对一台打印机的状态进行控制
    SetPrinterData设置打印机的注册表配置信息
    StartDoc开始一个打印作业
    StartDocPrinter在后台打印的级别启动一个新文档
    StartPage打印一个新页前要先调用这个函数
    StartPagePrinter在打印作业中指定一个新页的开始
    WritePrinter将发送目录中的数据写入打印机

    5、API之文本和字体函数

    windows api描述
    AddFontResource在Windows系统中添加一种字体资源
    CreateFont用指定的属性创建一种逻辑字体
    CreateFontIndirect用指定的属性创建一种逻辑字体
    CreateScalableFontResource为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统
    DrawText将文本描绘到指定的矩形中
    DrawTextEx与DrawText相似,只是加入了更多的功能
    EnumFontFamilies列举指定设备可用的字体
    EnumFontFamiliesEx列举指定设备可用的字体
    EnumFonts列举指定设备可用的字体
    ExtTextOut经过扩展的文本描绘函数。也请参考SetTextAlign函数
    GectRatioFilterEx用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时,本函数可判断纵横比大小
    GetCharABCWidths判断TureType字体中一个或多个字符的A-B-C大小
    GetCharABCWidthsFloat查询一种字体中一个或多个字符的A-B-C尺寸
    GetCharacterPlacement该函数用于了解如何用一个给定的字符显示一个字串
    GetCharWidth调查字体中一个或多个字符的宽度
    GetFontData接收一种可缩放字体文件的数据
    GetFontLanguageInfo返回目前选入指定设备场景中的字体的信息
    GetGlyphOutline取得TureType字体中构成一个字符的曲线信息
    GetKerningPairs取得指定字体的字距信息
    GetOutlineTextMetrics接收与TureType字体内部特征有关的详细信息
    GetRasterizerCaps了解系统是否有能力支持可缩放的字体
    GetTabbedTextExtent判断一个字串占据的范围,同时考虑制表站扩充的因素
    GetTextAlign接收一个设备场景当前的文本对齐标志
    GetTextCharacterExtra判断额外字符间距的当前值
    GetTextCharset接收当前选入指定设备场景的字体的字符集标识符
    GetTextCharsetInfo获取与当前选定字体的字符集有关的详细信息
    GetTextColor判断当前字体颜色。通常也称为“前景色”
    GetTextExtentExPoint判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息
    GetTextExtentPoint判断一个字串的大小(范围)
    GetTextFace获取一种字体的字样名
    GetTextMetrics获取与选入一种设备场景的物理字体有关的信息
    GrayString描绘一个以灰色显示的字串。通常由Windows用于标识禁止状态
    PolyTextOut描绘一系列字串
    RemoveFontResource从Windows系统中删除一种字体资源
    SetMapperFlagsWindows对字体进行映射时,可用该函数选择与目标设备的纵横比相符的光栅字体
    SetTextAlign设置文本对齐方式,并指定在文本输出过程中使用设备场景的当前位置
    SetTextCharacterExtra描绘文本的时候,指定要在字符间插入的额外间距
    SetTextColor设置当前文本颜色。这种颜色也称为“前景色”
    SetTextJustification通过指定一个文本行应占据的额外空间,可用这个函数对文本进行两端对齐处理
    TabbedTextOut支持制表站的一个文本描绘函数
    TextOut文本绘图函数

    6、API之菜单函数

    windows api描述
    AppendMenu在指定的菜单里添加一个菜单项
    CheckMenuItem复选或撤消复选指定的菜单条目
    CheckMenuRadioItem指定一个菜单条目被复选成“单选”项目
    CreateMenu创建新菜单
    CreatePopupMenu创建一个空的弹出式菜单
    DeleteMenu删除指定的菜单条目
    DestroyMenu删除指定的菜单
    DrawMenuBar为指定的窗口重画菜单
    EnableMenuItem允许或禁止指定的菜单条目
    GetMenu取得窗口中一个菜单的句柄
    GetMenuCheckMarkDimensions返回一个菜单复选符的大小
    GetMenuContextHelpId取得一个菜单的帮助场景ID
    GetMenuDefaultItem判断菜单中的哪个条目是默认条目
    GetMenuItemCount返回菜单中条目(菜单项)的数量
    GetMenuItemID返回位于菜单中指定位置处的条目的菜单ID
    GetMenuItemInfo取得(接收)与一个菜单条目有关的特定信息
    GetMenuItemRect在一个矩形中装载指定菜单条目的屏幕坐标信息
    GetMenuState取得与指定菜单条目状态有关的信息
    GetMenuString取得指定菜单条目的字串
    GetSubMenu取得一个弹出式菜单的句柄,它位于菜单中指定的位置
    GetSystemMenu取得指定窗口的系统菜单的句柄
    HiliteMenuItem控制顶级菜单条目的加亮显示状态
    InsertMenu在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动
    InsertMenuItem插入一个新菜单条目
    IsMenu判断指定的句柄是否为一个菜单的句柄
    LoadMenu从指定的模块或应用程序实例中载入一个菜单
    LoadMenuIndirect载入一个菜单
    MenuItemFromPoint判断哪个菜单条目包含了屏幕上一个指定的点
    ModifyMenu改变菜单条目
    RemoveMenu删除指定的菜单条目
    SetMenu设置窗口菜单
    SetMenuContextHelpId设置一个菜单的帮助场景ID
    SetMenuDefaultItem将一个菜单条目设为默认条目
    SetMenuItemBitmaps设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)
    SetMenuItemInfo为一个菜单条目设置指定的信息
    TrackPopupMenu在屏幕的任意地方显示一个弹出式菜单
    TrackPopupMenuEx与TrackPopupMenu相似,只是它提供了额外的功能

    7、API之位图、图标和光栅运算函数

    windows api描述
    BitBlt将一幅位图从一个设备场景复制到另一个
    CopyIcon制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序
    CopyImage复制位图、图标或指针,同时在复制过程中进行一些转换工作
    CreateBitmap按照规定的格式创建一幅与设备有关位图
    CreateBitmapIndirect创建一幅与设备有关位图
    CreateCompatibleBitmap创建一幅与设备有关位图,它与指定的设备场景兼容
    CreateCursor创建一个鼠标指针
    CreateDIBitmap根据一幅与设备无关的位图创建一幅与设备有关的位图
    CreateDIBSection创建一个DIBSection
    CreateIcon创建一个图标
    CreateIconIndirect创建一个图标
    DestroyCursor清除指定的鼠标指针,并释放它占用的所有系统资源
    DestroyIcon清除图标
    DrawIcon在指定的位置画一个图标
    DrawIconEx描绘一个图标或鼠标指针。与DrawIcon相比,这个函数提供了更多的功能
    ExtractAssociatedIcon判断一个可执行程序或DLL中是否存在图标,或是否有图标与系统注册表中指定的文件存在关联并提取之
    ExtractIcon判断一个可执行文件或DLL中是否有图标存在,并将其提取出来
    GetBitmapBits将来自位图的二进制位复制到一个缓冲区
    GetBitmapDimensionEx取得一幅位图的宽度和高度
    GetDIBColorTable从选入设备场景的DIBSection中取得颜色表信息
    GetDIBits将来自一幅位图的二进制位复制到一幅与设备无关的位图里
    GetIconInfo取得与图标有关的信息
    GetStretchBltMode判断StretchBlt 和 StretchDIBits函数采用的伸缩模式
    LoadBitmap从指定的模块或应用程序实例中载入一幅位图
    LoadCursor从指定的模块或应用程序实例中载入一个鼠标指针
    LoadCursorFromFile在一个指针文件或一个动画指针文件的基础上创建一个指针
    LoadIcon从指定的模块或应用程序实例中载入一个图标
    LoadImage载入一个位图、图标或指针
    MaskBlt执行复杂的图象传输,同时进行掩模(MASK)处理
    PatBlt在当前选定的刷子的基础上,用一个图案填充指定的设备场景
    PlgBlt复制一幅位图,同时将其转换成一个平行四边形。利用它可对位图进行旋转处理
    SetBitmapBits将来自缓冲区的二进制位复制到一幅位图
    SetBitmapDimensionEx设置一幅位图的宽度。以一毫米的十分之一为单位
    SetDIBColorTable设置选入设备场景的一个DIBSection的颜色表信息
    SetDIBits将来自与设备无关位图的二进制位复制到一幅与设备有关的位图里
    SetDIBitsToDevice将一幅与设备无关位图的全部或部分数据直接复制到一个设备
    SetStretchBltMode指定StretchBlt 和 StretchDIBits函数的伸缩模式
    StretchBlt将一幅位图从一个设备场景复制到另一个
    StretchDIBits将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景

    8、API之绘图函数

    windows api描述
    AbortPath抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作
    AngleArc用一个连接弧画一条线
    Arc画一个圆弧
    BeginPath启动一个路径分支
    CancelDC取消另一个线程里的长时间绘图操作
    Chord画一个弦
    CloseEnhMetaFile关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄
    CloseFigure描绘到一个路径时,关闭当前打开的图形
    CloseMetaFile关闭指定的图元文件设备场景,并向新建的图元文件返回一个句柄
    CopyEnhMetaFile制作指定增强型图元文件的一个副本(拷贝)
    CopyMetaFile制作指定(标准)图元文件的一个副本
    CreateBrushIndirect在一个LOGBRUSH数据结构的基础上创建一个刷子
    CreateDIBPatternBrush用一幅与设备无关的位图创建一个刷子,以便指定刷子样式(图案)
    CreateEnhMetaFile创建一个增强型的图元文件设备场景
    CreateHatchBrush创建带有阴影图案的一个刷子
    CreateMetaFile创建一个图元文件设备场景
    CreatePatternBrush用指定了刷子图案的一幅位图创建一个刷子
    CreatePen用指定的样式、宽度和颜色创建一个画笔
    CreatePenIndirect根据指定的LOGPEN结构创建一个画笔
    CreateSolidBrush用纯色创建一个刷子
    DeleteEnhMetaFile删除指定的增强型图元文件
    DeleteMetaFile删除指定的图元文件
    DeleteObject删除GDI对象,对象使用的所有系统资源都会被释放
    DrawEdge用指定的样式描绘一个矩形的边框
    DrawEscape换码(Escape)函数将数据直接发至显示设备驱动程序
    DrawFocusRect画一个焦点矩形
    DrawFrameControl描绘一个标准控件
    DrawState为一幅图象或绘图操作应用各式各样的效果
    Ellipse描绘一个椭圆,由指定的矩形围绕
    EndPath停止定义一个路径
    EnumEnhMetaFile针对一个增强型图元文件,列举其中单独的图元文件记录
    EnumMetaFile为一个标准的windows图元文件枚举单独的图元文件记录
    EnumObjects枚举可随同指定设备场景使用的画笔和刷子
    ExtCreatePen创建一个扩展画笔(装饰或几何)
    ExtFloodFill在指定的设备场景里,用当前选择的刷子填充一个区域
    FillPath关闭路径中任何打开的图形,并用当前刷子填充
    FillRect用指定的刷子填充一个矩形
    FlattenPath将一个路径中的所有曲线都转换成线段
    FloodFill用当前选定的刷子在指定的设备场景中填充一个区域
    FrameRect用指定的刷子围绕一个矩形画一个边框
    GdiComment为指定的增强型图元文件设备场景添加一条注释信息
    GdiFlush执行任何未决的绘图操作
    GdiGetBatchLimit判断有多少个GDI绘图命令位于队列中
    GdiSetBatchLimit指定有多少个GDI绘图命令能够进入队列
    GetArcDirection画圆弧的时候,判断当前采用的绘图方向
    GetBkColor取得指定设备场景当前的背景颜色
    GetBkMode针对指定的设备场景,取得当前的背景填充模式
    GetBrushOrgEx判断指定设备场景中当前选定刷子起点
    GetCurrentObject获得指定类型的当前选定对象
    GetCurrentPositionEx在指定的设备场景中取得当前的画笔位置
    GetEnhMetaFile取得磁盘文件中包含的一个增强型图元文件的图元文件句柄
    GetEnhMetaFileBits将指定的增强型图元文件复制到一个内存缓冲区里
    GetEnhMetaFileDescription返回对一个增强型图元文件的说明
    GetEnhMetaFileHeader取得增强型图元文件的图元文件头
    GetEnhMetaFilePaletteEntries取得增强型图元文件的全部或部分调色板
    GetMetaFile取得包含在一个磁盘文件中的图元文件的图元文件句柄
    GetMetaFileBitsEx将指定的图元文件复制到一个内存缓冲区
    GetMiterLimit取得设备场景的斜率限制(Miter)设置
    GetNearestColor根据设备的显示能力,取得与指定颜色最接近的一种纯色
    GetObjectAPI取得对指定对象进行说明的一个结构
    GetObjectType判断由指定句柄引用的GDI对象的类型
    GetPath取得对当前路径进行定义的一系列数据
    GetPixel在指定的设备场景中取得一个像素的RGB值
    GetPolyFillMode针对指定的设备场景,获得多边形填充模式
    GetROP2针对指定的设备场景,取得当前的绘图模式
    GetStockObject取得一个固有对象(Stock)
    GetSysColorBrush为任何一种标准系统颜色取得一个刷子
    GetWinMetaFileBits通过在一个缓冲区中填充用于标准图元文件的数据,将一个增强型图元文件转换成标准windows图元文件
    InvertRect通过反转每个像素的值,从而反转一个设备场景中指定的矩形
    LineDDA枚举指定线段中的所有点
    LineTo用当前画笔画一条线,从当前位置连到一个指定的点
    MoveToEx为指定的设备场景指定一个新的当前画笔位置
    PaintDesk在指定的设备场景中描绘桌面墙纸图案
    PathToRegion将当前选定的路径转换到一个区域里
    Pie画一个饼图
    PlayEnhMetaFile在指定的设备场景中画一个增强型图元文件
    PlayEnhMetaFileRecord回放单独一条增强型图元文件记录
    PlayMetaFile在指定的设备场景中回放一个图元文件
    PlayMetaFileRecord回放来自图元文件的单条记录
    PolyBezier描绘一条或多条贝塞尔(Bezier)曲线
    PolyDraw描绘一条复杂的曲线,由线段及贝塞尔曲线组成
    Polygon描绘一个多边形
    Polyline用当前画笔描绘一系列线段
    PolyPolygon用当前选定画笔描绘两个或多个多边形
    PolyPolyline用当前选定画笔描绘两个或多个多边形
    Rectangle用当前选定的画笔描绘矩形,并用当前选定的刷子填充
    RoundRect用当前选定的画笔画一个圆角矩形,并用当前选定的刷子在其中填充
    SelectClipPath将设备场景当前的路径合并到剪切区域里
    SelectObject为当前设备场景选择图形对象
    SetArcDirection设置圆弧的描绘方向
    SetBkColor为指定的设备场景设置背景颜色
    SetBkMode指定阴影刷子、虚线画笔以及字符中的空隙的填充方式
    SetBrushOrgEx为指定的设备场景设置当前选定刷子的起点
    SetEnhMetaFileBits用指定内存缓冲区内包含的数据创建一个增强型图元文件
    SetMetaFileBitsEx用包含在指定内存缓冲区内的数据结构创建一个图元文件
    SetMiterLimit设置设备场景当前的斜率限制
    SetPixel在指定的设备场景中设置一个像素的RGB值
    SetPixelV在指定的设备场景中设置一个像素的RGB值
    SetPolyFillMode设置多边形的填充模式
    SetROP2设置指定设备场景的绘图模式。与vb的DrawMode属性完全一致
    SetWinMetaFileBits将一个标准Windows图元文件转换成增强型图元文件
    StrokeAndFillPath针对指定的设备场景,关闭路径上打开的所有区域
    StrokePath用当前画笔描绘一个路径的轮廓。打开的图形不会被这个函数关闭
    UnrealizeObject将一个刷子对象选入设备场景之前,如刷子的起点准备用SetBrushOrgEx修改,则必须先调用本函数
    WidenPath根据选定画笔的宽度,重新定义当前选定的路径

    9、API之设备场景函数

    windows api描述
    CombineRgn将两个区域组合为一个新区域
    CombineTransform驱动世界转换。它相当于依顺序进行两次转换
    CreateCompatibleDC创建一个与特定设备场景一致的内存设备场景
    CreateDC为专门设备创建设备场景
    CreateEllipticRgn创建一个椭圆
    CreateEllipticRgnIndirect创建一个内切于特定矩形的椭圆区域
    CreateIC为专用设备创建一个信息场景
    CreatePolygonRgn创建一个由一系列点围成的区域
    CreatePolyPolygonRgn创建由多个多边形构成的区域。每个多边形都应是封闭的
    CreateRectRgn创建一个矩形区域
    CreateRectRgnIndirect创建一个矩形区域
    CreateRoundRectRgn创建一个圆角矩形
    DeleteDC删除专用设备场景或信息场景,释放所有相关窗口资源
    DPtoLP将点阵从设备坐标转换到专用设备场景逻辑坐标
    EqualRgn确定两个区域是否相等
    ExcludeClipRect从专用设备场景的剪裁区中去掉一个矩形区。矩形内不能进行绘图
    ExcludeUpdateRgn从专用设备场景剪裁区去掉指定窗口的刷新区域
    ExtCreateRegion根据世界转换修改区域
    ExtSelectClipRgn将指定区域组合到设备场景的当前剪裁区
    FillRgn用指定刷子填充指定区域
    FrameRgn用指定刷子围绕指定区域画一个外框
    GetBoundsRect获取指定设备场景的边界矩形
    GetClipBox获取完全包含指定设备场景剪裁区的最小矩形
    GetClipRgn获取设备场景当前剪裁区
    GetDC获取指定窗口的设备场景
    GetDCEx为指定窗口获取设备场景。相比GetDC,本函数提供了更多的选项
    GetDCOrgEx获取指定设备场景起点位置(以屏幕坐标表示)
    GetDeviceCaps根据指定设备场景代表的设备的功能返回信息
    GetGraphicsMode确定是否允许增强图形模式(世界转换)
    GetMapMode为特定设备场景调入映象模式
    GetRegionData装入描述一个区域信息的RgnData结构或缓冲区
    GetRgnBox获取完全包含指定区域的最小矩形
    GetUpdateRgn确定指定窗口的刷新区域。该区域当前无效,需要刷新
    GetViewportExtEx获取设备场景视口(viewport)范围
    GetViewportOrgEx获取设备场景视口起点
    GetWindowDC获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
    GetWindowExtEx获取指定设备场景的窗口范围
    GetWindowOrgEx获取指定设备场景的逻辑窗口的起点
    GetWindowRgn获取窗口区域
    GetWorldTransform如果有世界转换,为设备场景获取当前世界转换
    IntersectClipRect为指定设备定义一个新的剪裁区
    InvalidateRgn使窗口指定区域不活动,并将它加入窗口刷新区,使之可随后被重画
    InvertRgn通过颠倒每个像素值反转设备场景指定区域
    LPtoDP将点阵从指定设备场景逻辑坐标转换为设备坐标
    ModifyWorldTransform根据指定的模式修改世界转换
    OffsetClipRgn按指定量平移设备场景剪裁区
    OffsetRgn按指定偏移量平移指定区域
    OffsetViewportOrgEx平移设备场景视口区域
    OffsetWindowOrgEx平移指定设备场景窗口起点
    PaintRgn用当前刷子背景色填充指定区域
    PtInRegion确定点是否在指定区域内
    PtVisible确定指定点是否可见(即,点是否在设备场景剪裁区内)
    RectInRegion确定矩形是否有部分在指定区域内
    RectVisible确定指定矩形是否有部分可见(是否在设备场景剪裁区内)
    ReleaseDC释放由调用GetDC或GetWindowDC函数获取的指定设备场景
    RestoreDC从设备场景堆栈恢复一个原先保存的设备场景
    SaveDC将指定设备场景状态保存到Windows设备场景堆栈
    ScaleViewportExtEx缩放设备场景视口的范围
    ScaleWindowExtEx缩放指定设备场景窗口范围
    ScrollDC在窗口(由设备场景代表)中水平和(或)垂直滚动矩形
    SelectClipRgn为指定设备场景选择新的剪裁区
    SetBoundsRect设置指定设备场景的边界矩形
    SetGraphicsMode允许或禁止增强图形模式,以提供某些支持(包括世界转换)
    SetMapMode设置指定设备场景的映射模式
    SetRectRgn设置区域为指定的矩形
    SetViewportExtEx设置设备场景视口范围
    SetViewportOrgEx设置设备场景视口起点
    SetWindowExtEx设置指定设备场景窗口范围
    SetWindowOrgEx设置指定设备场景窗口起点
    SetWindowRgn设置窗口区域
    SetWorldTransform设置世界转换
    ValidateRgn激活窗口中指定区域,把它从刷新区移走
    WindowFromDC取回与某一设备场景相关的窗口的句柄

    10、API之硬件与系统函数

    windows api描述
    ActivateKeyboardLayout激活一个新的键盘布局。键盘布局定义了按键在一种物理性键盘上的位置与含义
    Beep用于生成简单的声音
    CharToOem将一个字串从ANSI字符集转换到OEM字符集
    ClipCursor将指针限制到指定区域
    ConvertDefaultLocale将一个特殊的地方标识符转换成真实的地方ID
    CreateCaret根据指定的信息创建一个插入符(光标),并将它选定为指定窗口的默认插入符
    DestroyCaret清除(破坏)一个插入符
    EnumCalendarInfo枚举在指定“地方”环境中可用的日历信息
    EnumDateFormats列举指定的“当地”设置中可用的长、短日期格式
    EnumSystemCodePages枚举系统中已安装或支持的代码页
    EnumSystemLocales枚举系统已经安装或提供支持的“地方”设置
    EnumTimeFormats枚举一个指定的地方适用的时间格式
    ExitWindowsEx退出windows,并用特定的选项重新启动
    ExpandEnvironmentStrings扩充环境字串
    FreeEnvironmentStrings翻译指定的环境字串块
    GetACP判断目前正在生效的ANSI代码页
    GetAsyncKeyState判断函数调用时指定虚拟键的状态
    GetCaretBlinkTime判断插入符光标的闪烁频率
    GetCaretPos判断插入符的当前位置
    GetClipCursor取得一个矩形,用于描述目前为鼠标指针规定的剪切区域
    GetCommandLine获得指向当前命令行缓冲区的一个指针
    GetComputerName取得这台计算机的名称
    GetCPInfo取得与指定代码页有关的信息
    GetCurrencyFormat针对指定的“地方”设置,根据货币格式格式化一个数字
    GetCursor获取目前选择的鼠标指针的句柄
    GetCursorPos获取鼠标指针的当前位置
    GetDateFormat针对指定的“当地”格式,对一个系统日期进行格式化
    GetDoubleClickTime判断连续两次鼠标单击之间会被处理成双击事件的间隔时间
    GetEnvironmentStrings为包含了当前环境字串设置的一个内存块分配和返回一个句柄
    GetEnvironmentVariable取得一个环境变量的值
    GetInputState判断是否存在任何待决(等待处理)的鼠标或键盘事件
    GetKBCodePage由GetOEMCP取代,两者功能完全相同
    GetKeyboardLayout取得一个句柄,描述指定应用程序的键盘布局
    GetKeyboardLayoutList获得系统适用的所有键盘布局的一个列表
    GetKeyboardLayoutName取得当前活动键盘布局的名称
    GetKeyboardState取得键盘上每个虚拟键当前的状态
    GetKeyboardType了解与正在使用的键盘有关的信息
    GetKeyNameText在给出扫描码的前提下,判断键名
    GetKeyState针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态
    GetLastError针对之前调用的api函数,用这个函数取得扩展错误信息
    GetLocaleInfo取得与指定“地方”有关的信息
    GetLocalTime取得本地日期和时间
    GetNumberFormat针对指定的“地方”,按特定的格式格式化一个数字
    GetOEMCP判断在OEM和ANSI字符集间转换的windows代码页
    GetQueueStatus判断应用程序消息队列中待决(等待处理)的消息类型
    GetSysColor判断指定windows显示对象的颜色
    GetSystemDefaultLangID取得系统的默认语言ID
    GetSystemDefaultLCID取得当前的默认系统“地方”
    GetSystemInfo取得与底层硬件平台有关的信息
    GetSystemMetrics返回与windows环境有关的信息
    GetSystemPowerStatus获得与当前系统电源状态有关的信息
    GetSystemTime取得当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式
    GetSystemTimeAdjustment使内部系统时钟与一个外部的时钟信号源同步
    GetThreadLocale取得当前线程的地方ID
    GetTickCount用于获取自windows启动以来经历的时间长度(毫秒)
    GetTimeFormat针对当前指定的“地方”,按特定的格式格式化一个系统时间
    GetTimeZoneInformation取得与系统时区设置有关的信息
    GetUserDefaultLangID为当前用户取得默认语言ID
    GetUserDefaultLCID取得当前用户的默认“地方”设置
    GetUserName取得当前用户的名字
    GetVersion判断当前运行的Windows和DOS版本
    GetVersionEx取得与平台和操作系统有关的版本信息
    HideCaret在指定的窗口隐藏插入符(光标)
    IsValidCodePage判断一个代码页是否有效
    IsValidLocale判断地方标识符是否有效
    keybd_event这个函数模拟了键盘行动
    LoadKeyboardLayout载入一个键盘布局
    MapVirtualKey根据指定的映射类型,执行不同的扫描码和字符转换
    MapVirtualKeyEx根据指定的映射类型,执行不同的扫描码和字符转换
    MessageBeep播放一个系统声音。系统声音的分配方案是在控制面板里决定的
    mouse_event模拟一次鼠标事件
    OemKeyScan判断OEM字符集中的一个ASCII字符的扫描码和Shift键状态
    OemToChar将OEM字符集的一个字串转换到ANSI字符集
    SetCaretBlinkTime指定插入符(光标)的闪烁频率
    SetCaretPos指定插入符的位置
    SetComputerName设置新的计算机名
    SetCursor将指定的鼠标指针设为当前指针
    SetCursorPos设置指针的位置
    SetDoubleClickTime设置连续两次鼠标单击之间能使系统认为是双击事件的间隔时间
    SetEnvironmentVariable将一个环境变量设为指定的值
    SetKeyboardState设置每个虚拟键当前在键盘上的状态
    SetLocaleInfo改变用户“地方”设置信息
    SetLocalTime设置当前地方时间
    SetSysColors设置指定窗口显示对象的颜色
    SetSystemCursor改变任何一个标准系统指针
    SetSystemTime设置当前系统时间
    SetSystemTimeAdjustment定时添加一个校准值使内部系统时钟与一个外部的时钟信号源同步
    SetThreadLocale为当前线程设置地方
    SetTimeZoneInformation设置系统时区信息
    ShowCaret在指定的窗口里显示插入符(光标)
    ShowCursor控制鼠标指针的可视性
    SwapMouseButton决定是否互换鼠标左右键的功能
    SystemParametersInfo获取和设置数量众多的windows系统参数
    SystemTimeToTzSpecificLocalTime将系统时间转换成地方时间
    ToAscii根据当前的扫描码和键盘信息,将一个虚拟键转换成ASCII字符
    ToUnicode根据当前的扫描码和键盘信息,将一个虚拟键转换成Unicode字符
    UnloadKeyboardLayout卸载指定的键盘布局
    VkKeyScan针对Windows字符集中一个ASCII字符,判断虚拟键码和Shift键的状态

    11、API之进程和线程函数

    windows api描述
    CancelWaitableTimer这个函数用于取消一个可以等待下去的计时器操作
    CallNamedPipe这个函数由一个希望通过管道通信的一个客户进程调用
    ConnectNamedPipe指示一台服务器等待下去,直至客户机同一个命名管道连接
    CreateEvent创建一个事件对象
    CreateMailslot创建一个邮路。返回的句柄由邮路服务器使用(收件人)
    CreateMutex创建一个互斥体(MUTEX)
    CreateNamedPipe创建一个命名管道。返回的句柄由管道的服务器端使用
    CreatePipe创建一个匿名管道
    CreateProcess创建一个新进程(比如执行一个程序)
    CreateSemaphore创建一个新的信号机
    CreateWaitableTimer创建一个可等待的计时器对象
    DisconnectNamedPipe断开一个客户与一个命名管道的连接
    DuplicateHandle在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄
    ExitProcess中止一个进程
    FindCloseChangeNotification关闭一个改动通知对象
    FindExecutable查找与一个指定文件关联在一起的程序的文件名
    FindFirstChangeNotification创建一个文件通知对象。该对象用于监视文件系统发生的变化
    FindNextChangeNotification重设一个文件改变通知对象,令其继续监视下一次变化
    FreeLibrary释放指定的动态链接库
    GetCurrentProcess获取当前进程的一个伪句柄
    GetCurrentProcessId获取当前进程一个唯一的标识符
    GetCurrentThread获取当前线程的一个伪句柄
    GetCurrentThreadId获取当前线程一个唯一的线程标识符
    GetExitCodeProces获取一个已中断进程的退出代码
    GetExitCodeThread获取一个已中止线程的退出代码
    GetHandleInformation获取与一个系统对象句柄有关的信息
    GetMailslotInfo获取与一个邮路有关的信息
    GetModuleFileName获取一个已装载模板的完整路径名称
    GetModuleHandle获取一个应用程序或动态链接库的模块句柄
    GetPriorityClass获取特定进程的优先级别
    GetProcessShutdownParameters调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况
    GetProcessTimes获取与一个进程的经过时间有关的信息
    GetProcessWorkingSetSize了解一个应用程序在运行过程中实际向它交付了多大容量的内存
    GetSartupInfo获取一个进程的启动信息
    GetThreadPriority获取特定线程的优先级别
    GetTheardTimes获取与一个线程的经过时间有关的信息
    GetWindowThreadProcessId获取与指定窗口关联在一起的一个进程和线程标识符
    LoadLibrary载入指定的动态链接库,并将它映射到当前进程使用的地址空间
    LoadLibraryEx装载指定的动态链接库,并为当前进程把它映射到地址空间
    LoadModule载入一个Windows应用程序,并在指定的环境中运行
    MsgWaitForMultipleObjects等侯单个对象或一系列对象发出信号。如返回条件已经满足,则立即返回
    SetPriorityClass设置一个进程的优先级别
    SetProcessShutdownParameters在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序
    SetProcessWorkingSetSize设置操作系统实际划分给进程使用的内存容量
    SetThreadPriority设定线程的优先级别
    ShellExecute查找与指定文件关联在一起的程序的文件名
    TerminateProcess结束一个进程
    WinExec运行指定的程序

    12、API之控件与消息函数

    windows api描述
    AdjustWindowRect给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小
    AnyPopup判断屏幕上是否存在任何弹出式窗口
    ArrangeIconicWindows排列一个父窗口的最小化子窗口
    AttachThreadInput连接线程输入函数
    BeginDeferWindowPos启动构建一系列新窗口位置的过程
    BringWindowToTop将指定的窗口带至窗口列表顶部
    CascadeWindows以层叠方式排列窗口
    ChildWindowFromPoint返回父窗口中包含了指定点的第一个子窗口的句柄
    ClientToScreen判断窗口内以客户区坐标表示的一个点的屏幕坐标
    CloseWindow最小化指定的窗口
    CopyRect矩形内容复制
    DeferWindowPos该函数为特定的窗口指定一个新窗口位置
    DestroyWindow清除指定的窗口以及它的所有子窗口
    DrawAnimatedRects描绘一系列动态矩形
    EnableWindow指定的窗口里允许或禁止所有鼠标及键盘输入
    EndDeferWindowPos同时更新DeferWindowPos调用时指定的所有窗口的位置及状态
    EnumChildWindows为指定的父窗口枚举子窗口
    EnumThreadWindows枚举与指定任务相关的窗口
    EnumWindows枚举窗口列表中的所有父窗口
    EqualRect判断两个矩形结构是否相同
    FindWindow寻找窗口列表中第一个符合指定条件的顶级窗口
    FindWindowEx在窗口列表中寻找与指定条件相符的第一个子窗口
    FlashWindow闪烁显示指定窗口
    GetActiveWindow获得活动窗口的句柄
    GetCapture获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获(鼠标活动由它接收)
    GetClassInfo取得WNDCLASS结构(或WNDCLASSEX结构)的一个副本,结构中包含了与指定类有关的信息
    GetClassLong取得窗口类的一个Long变量条目
    GetClassName为指定的窗口取得类名
    GetClassWord为窗口类取得一个整数变量
    GetClientRect返回指定窗口客户区矩形的大小
    GetDesktopWindow获得代表整个屏幕的一个窗口(桌面窗口)句柄
    GetFocus获得拥有输入焦点的窗口的句柄
    GetForegroundWindow获得前台窗口的句柄
    GetLastActivePopup获得在一个给定父窗口中最近激活过的弹出式窗口的句柄
    GetParent判断指定窗口的父窗口
    GetTopWindow搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄
    GetUpdateRect获得一个矩形,它描叙了指定窗口中需要更新的那一部分
    GetWindow获得一个窗口的句柄,该窗口与某源窗口有特定的关系
    GetWindowContextHelpId取得与窗口关联在一起的帮助场景ID
    GetWindowLong从指定窗口的结构中取得信息
    GetWindowPlacement获得指定窗口的状态及位置信息
    GetWindowRect获得整个窗口的范围矩形,窗口的边框、标题栏、滚动条及菜单等都在这个矩形内
    GetWindowText取得一个窗体的标题(caption)文字,或者一个控件的内容
    GetWindowTextLength调查窗口标题文字或控件内容的长短
    GetWindowWord获得指定窗口结构的信息
    InflateRect增大或减小一个矩形的大小
    IntersectRect这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集
    InvalidateRect屏蔽一个窗口客户区的全部或部分区域
    IsChild判断一个窗口是否为另一窗口的子或隶属窗口
    IsIconic判断窗口是否已最小化
    IsRectEmpty判断一个矩形是否为空
    IsWindow判断一个窗口句柄是否有效
    IsWindowEnabled判断窗口是否处于活动状态
    IsWindowUnicode判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收Unicode文字
    IsWindowVisible判断窗口是否可见
    IsZoomed判断窗口是否最大化
    LockWindowUpdate锁定指定窗口,禁止它更新
    MapWindowPoints将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统
    MoveWindow改变指定窗口的位置和大小
    OffsetRect通过应用一个指定的偏移,从而让矩形移动起来
    OpenIcon恢复一个最小化的程序,并将其激活
    PtInRect判断指定的点是否位于矩形内部
    RedrawWindow重画全部或部分窗口
    ReleaseCapture为当前的应用程序释放鼠标捕获
    ScreenToClient判断屏幕上一个指定点的客户区坐标
    ScrollWindow滚动窗口客户区的全部或一部分
    ScrollWindowEx根据附加的选项,滚动窗口客户区的全部或部分
    SetActiveWindow激活指定的窗口
    SetCapture将鼠标捕获设置到指定的窗口
    SetClassLong为窗口类设置一个Long变量条目
    SetClassWord为窗口类设置一个条目
    SetFocusAPI将输入焦点设到指定的窗口。如有必要,会激活窗口
    SetForegroundWindow将窗口设为系统的前台窗口
    SetParent指定一个窗口的新父
    SetRect设置指定矩形的内容
    SetRectEmpty将矩形设为一个空矩形
    SetWindowContextHelpId为指定的窗口设置帮助场景(上下文)ID
    SetWindowLong在窗口结构中为指定的窗口设置信息
    SetWindowPlacement设置窗口状态和位置信息
    SetWindowPos为窗口指定一个新位置和状态
    SetWindowText设置窗口的标题文字或控件的内容
    SetWindowWord在窗口结构中为指定的窗口设置信息
    ShowOwnedPopups显示或隐藏由指定窗口所有的全部弹出式窗口
    ShowWindow控制窗口的可见性
    ShowWindowAsync与ShowWindow相似
    SubtractRect装载矩形lprcDst,它是在矩形lprcSrc1中减去lprcSrc2得到的结果
    TileWindows以平铺顺序排列窗口
    UnionRect装载一个lpDestRect目标矩形,它是lpSrc1Rect和lpSrc2Rect联合起来的结果
    UpdateWindow强制立即更新窗口
    ValidateRect校验窗口的全部或部分客户区
    WindowFromPoint返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口
    展开全文
  • C/C++ 从零实现一个windows窗口(非常详细)

    千次阅读 多人点赞 2022-04-13 09:38:05
    主要讲解用C/C++创建一个Windows窗口的全过程,非常详细了........


    插播一个小广告😌:

    想要学习人工智能的,可以点击这里,文章讲解的通俗易懂,风趣幽默

    当然如果你想学习C/C++的话,也欢迎来看看我写的C/C++从入门到精通系列文章咯!全程干货,绝不拖泥带水!可以点击这里查看

    前言

    学习完C/C++之后,最郁闷的可能就是感觉啥也干不了,怎么才能写出平常我们所使用的软件模样?

    而对于大部分人来说,最常使用的就是windows系统,所以这就需要了解windows编程,熟悉一个windows窗口的建立流程

    建立一个windows窗口的过程是非常繁琐的,真正做开发的时候,为了追求效率,一般会选用现场的框架,比如大型的QtMFC,或者小型灵巧的ATL模板库,可大大简化C/C++程序员的程序开发。

    而本文旨在了解实现一个基本windows窗口,我们需要做哪些必要步骤?以及明白当我们用别人的框架短短几行代码实现一个窗口的背后,框架为我们做了哪些工作?

    学习方法

    Windows API编程对新手来说是一件非常痛苦的事情,因为它全部用的自定义变量类型,和一些宏,以及很多函数的参数非常多,有的可能多达10个

    但这些你不需要过分关注,在VS中,你可以复制下代码后,右键具体的变量类型或函数,如WORD,然后点击速览定义,就可以看到它的实际类型,即C/C++中的如int,short char等基本数据类型
    在这里插入图片描述

    或者对于复杂的函数,如winmain等,只需要将鼠标点击到该函数名,按F1即可跳转到官方文档

    注意,这些完全不用专门去记住,因为WIndows自定义的类型太多了,你只需要知道怎样快速的查到信息即可,需要的时候直接查官方文档就可以了

    一、建立一个窗口的基本步骤

    1. 向系统注册一个窗体类
    2. 根据窗体类创建窗口
    3. 进入消息循环

    看起来很简单的,不是吗?也就三个步骤而已

    但真正让新手痛苦的是这三个步骤中所使用的大量Win API函数

    接下来就开始详细介绍具体各个步骤

    二、具体流程

    1.创建一个空的windows窗口项目

    选择windows桌面向导
    在这里插入图片描述
    随便取一个名字,根据我的经验,尽量用字母英文,别用汉字,否则以后可能会出现奇奇怪怪的错误
    在这里插入图片描述
    点击创建后,选择如下图所示的内容
    在这里插入图片描述
    点击确认即可
    在这里插入图片描述
    右键源文件,添加,新建项
    在这里插入图片描述
    创建一个.cpp文件即可,名字可自取,我习惯于用英文,防止出现不必要的意外

    这样,一个空的带窗口程序的空项目就建立完成了,但现在才刚刚开始!

    2.WinMain函数

    学到这里,相信至少对C/C++基础应该是相当熟悉的,一个最简单的C/C++程序就必须要写上main函数,否则无法编译成功,因为这是控制台程序的入口函数

    这里也一样,当你想写带界面的窗口程序,你就需要将入口函数改为WinMain

    函数原型:

    int WINAPI WinMain(
      [in] HINSTANCE hInstance, //当前应用程序的实例
      [in] HINSTANCE hPrevInstance, //这个不用管,想了解的可参考官方文档
      [in] LPSTR     lpCmdLine, //传入的命令行参数
      [in] int       nShowCmd //控制当前应用窗口如何显示
    );
    

    官方文档点这里

    前面的【in】等只是让你知道这个参数是输入还是输出的,可以直接删除掉,改下格式后,代码如下:
    在这里插入图片描述
    再次强调,不用试图去记忆,这会加重你的学习负载,直接复制即可,各个参数的含义,会在后面具体的代码中用到,用的多了,就自然而然的记住了

    3.注册窗口类

    这里主要用到API函数RegisterClass

    函数原型:

    ATOM RegisterClassA(
      [in] const WNDCLASSA *lpWndClass //填入要注册的窗口结构
    );
    

    窗口结构WNDCLASSA

    typedef struct tagWNDCLASSA {
      UINT      style;  //设置窗口格式,可参考官方文档,一般设置为水平重画与垂直重画:CS_HREDRAW | CS_VREDRAW
      WNDPROC   lpfnWndProc; //窗口的回调函数,也就是窗口接收到消息后,交给哪个函数处理
      int       cbClsExtra; //为类额外分配内存,一般为0
      int       cbWndExtra; //为窗口额外分配内存,一般为0
      HINSTANCE hInstance; //程序实例,这里就用到了WinMain函数的第一个参数hInstance
      HICON     hIcon; //设置程序图标
      HCURSOR   hCursor; //设置程序光标
      HBRUSH    hbrBackground; //设置程序背景色
      LPCSTR    lpszMenuName; //设置菜单名称
      LPCSTR    lpszClassName; //设置类名称
    } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
    

    使用:

    #include<Windows.h>
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {
    	WNDCLASS wndcls; //创建一个窗体类
    	wndcls.cbClsExtra = 0;//类的额外内存,默认为0即可
    	wndcls.cbWndExtra = 0;//窗口的额外内存,默认为0即可
    	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
    	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//设置光标
    	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//设置窗体左上角的图标
    	wndcls.hInstance = hInstance;//设置窗体所属的应用程序实例
    	wndcls.lpfnWndProc = NULL;//设置窗体的回调函数,暂时没写,先设置为NULL,后面补上
    	wndcls.lpszClassName = L"test";//设置窗体的类名
    	wndcls.lpszMenuName = NULL;//设置窗体的菜单,没有,填NULL
    	wndcls.style = CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画
    	RegisterClass(&wndcls);//向操作系统注册窗体
    }
    
    

    在这里插入图片描述

    在上述代码中,还用到了三个额外的API,

    GetStockObject:获取电脑自带的画刷,笔等
    LoadCursor:加载光标,也就是我们电脑屏幕上常见的箭头,十字,转圈等图形
    LoadIcon:加载图标资源

    这三个函数很简单,因为参数很少,不好理解的可能是这些参数应该怎能填?从哪里来?

    最稳妥的方法依旧是查看官方文档,虽然是英文,但现在的翻译也很强大了,相信难不倒诸位对吧(❁´◡`❁)

    比如这里用GetStockObject函数举例,进入官网,就可以看到可填参数有很多:
    在这里插入图片描述
    后面两个函数还多一个程序实例的参数,我都填的NULL,意思就是从系统默认中加载即可,我也没有自己做的图标啊ಠ_ಠ

    4.创建窗口

    这里用到的函数就可以说是一个超级函数了,参数多达11个(┬┬﹏┬┬)

    CreateWindow:创建一个窗口
    函数原型:

    void CreateWindowA(
      [in, optional]  lpClassName,//窗口类名,也就是上面注册窗口类时填的类名
      [in, optional]  lpWindowName, //窗口名,也就是窗口显示时,左上角显示的名称
      [in]            dwStyle, //窗口风格,一般填WS_OVERLAPPEDWINDOW即可,这样创建的窗口就有最大化,最小化等等等等属性。。。
      [in]            x, //窗口最开始被创建在哪里?这里填X坐标,一般默认CW_USEDEFAULT即可
      [in]            y, //窗口最开始被创建在哪里?这里填Y坐标,一般默认CW_USEDEFAULT即可
      [in]            nWidth, //窗口创建的宽度,一般默认CW_USEDEFAULT即可
      [in]            nHeight, //窗口创建的高度,一般默认CW_USEDEFAULT即可
      [in, optional]  hWndParent,//父窗口的句柄,没有,填NULL
      [in, optional]  hMenu, //菜单句柄,没有,填NULL
      [in, optional]  hInstance, //应用程序实例,这里就又用到了WinMain的第一个参数
      [in, optional]  lpParam //额外的数据,挺复杂的,咱们也不需要,填NULL就行了
    );
    

    虽然这个函数的参数巨多,但很多参数都是填默认的就可以了,所以有没有一种把它封装一下的冲动呢(●’◡’●),以后就可以填两三个参数就行了,这里我就先不谈了,可以自己尝试一下

    使用:

    	//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
    	HWND hwnd = CreateWindow(L"test", L"我的第一个窗口",
    		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    		NULL, NULL, hInstance, NULL);
    

    此时代码截图:
    在这里插入图片描述
    可能长的有点怪,但没办法,参数太多,一行放不下(┬┬﹏┬┬)

    此时还没有结束,因为窗口创建后默认隐藏的,所以我们还得让它显示出来:

    	ShowWindow(hwnd, SW_SHOWNORMAL);//把窗体显示出来
    	UpdateWindow(hwnd);//更新窗体
    

    这两个API函数也很简单,就一两个参数,稍微看一下文档就能明白
    ShowWindow :显示窗口的方式,我填的SW_SHOWNORMAL,即正常显示,更多可选参数看官方文档就完事了(❁´◡`❁),而前面那个hwnd就是上面创建窗口返回的窗口句柄
    UpdateWindow:就一个参数,上面创建窗口时返回的窗口句柄,作用就是给窗口发个消息,命令它马上重新画一下窗口 ╰(‵□′)╯

    此时的代码截图:
    在这里插入图片描述

    5.消息循环

    消息循环对于一个带界面的程序来说可以是最重要的一环了

    如何理解消息呢?举个简单的例子,就是当你用鼠标拖动一个窗口时,窗口为啥能跟着你的鼠标运动?就是依靠的消息。

    当你的鼠标点击窗口时,就会向对应的窗口发送鼠标点击消息,当你鼠标左键点击并移动时,就会向窗体发送鼠标点击和移动的消息

    所谓的消息其实也就是一个结构体,其中包含了消息的类型和其它相关的信息,比如鼠标点击的屏幕坐标等,这个还是老话,得参考官方文档!

    下面就开始正式介绍消息循环

    消息循环中主要用到了三个API函数:
    GetMessage:拿到消息
    TranslateMessage:翻译消息
    DispatchMessage:派发消息

    函数原型:

    BOOL GetMessage(
      [out]          LPMSG lpMsg, //拿到的消息
      [in, optional] HWND  hWnd, //拿哪个窗口的消息,一般填NULL,即拿属于该线程所有窗口的消息
      [in]           UINT  wMsgFilterMin, //过滤消息,最小值,一般填0
      [in]           UINT  wMsgFilterMax //过滤消息,最大值,一般填0,当两个均为0,则不进行过滤
    );
    
    BOOL TranslateMessage(
      [in] const MSG *lpMsg //翻译消息,如将WMWM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
    );
    

    该函数官方文档的内容中,说道如果使用虚拟键码的话,就可不用该函数╰(°▽°)╯,所以还是得多看官方文档啊,总能有一些意外之喜
    在这里插入图片描述
    这里又说道了虚拟键码,真是越学东西越多啊(┬┬﹏┬┬)

    所谓虚拟键码,就是一个数值而已,某一个确定的数值代表你按下的某个键,比如当你按下A键,程序就会收到一个包含数值0x41的消息,这个数字其实就是字母A的ASCII码表的值,所以代码中可以直接写为’A’就可以了

    ASCII码表应该就不用过多解释了吧…

    如果不理解,还是看下面的程序吧!至少得把基本步骤记住啊!

    LRESULT DispatchMessage(
      [in] const MSG *lpMsg
    );
    

    该函数就是把消息派发给对应的窗口,因为一个程序可以有很多窗口的吧,总得让消息发送给对应的窗口,否则我点这个窗口,要么没反映----没有收到消息,要么另外一个窗口动了----发错窗口了…

    6.回调函数

    回调函数可就很重要了,因为你在窗口上所做的一切,都会以消息的形式发送给窗口,而窗口就是通过回调函数来处理这些消息的!

    回调函数格式:

    LRESULT CALLBACK WinSunProc(
    	HWND hwnd,      // 窗口句柄
    	UINT uMsg,      // 消息识别符
    	WPARAM wParam,  // 第一个消息参数
    	LPARAM lParam   // 第二个消息参数
    )
    

    这个函数的参数由系统传入,特别是后两个参数,其含义取决于收到的消息类型!

    就可以写下代码:

    LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    
    

    此函数中写个switch结构是基本操作,目的就是不同消息进行不同处理

    具体系统有哪些消息呢?点这里查看

    需要注意的是DefWindowProc函数,参数就是回调函数所传入的参数,目的就是对我们不感兴趣的消息进行默认处理

    此时就可以为我们前面窗口类的回调函数参数填上此函数的名称

    此时程序结构如下:
    在这里插入图片描述
    现在,你就已经可以运行程序了!
    在这里插入图片描述
    成功出现窗口!

    左上角那个X就是前面LoadIcon加载的资源,光标是个十字就是LoadCursor函数加载的资源,可自行更改

    可能你会注意到,当你点击右上角的X时,窗口没了,但程序仍然在运行,这是因为我们没有处理窗口关闭消息

    此时应该添加对WM_CLOSE和WM_DESTROY消息的处理

    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	case WM_CLOSE:
    		DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
    		break;
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    

    当你点击关闭时,会发送WM_CLOSE消息到该函数,这里再WM_COLSE的消息处理中调用了DestroyWindow函数,该函数的作用就是彻底摧毁该窗口和与该窗口相关的一切东西,并向自己发送WM_WM_DESTROY消息

    所以我们就需要处理WM_DESTROY消息,这里调用了PostQuitMessage函数,目的是发送一个退出程序的消息 WM_QUIT ,当消息循环中的GetMessage函数收到该消息时,就会返回0,继而退出while循环,进而程序结束

    此时运行程序,就可以正常退出了!

    至此,通过重重困难,你终于从0写出了一个窗口程序了!

    此时你也应该明白哪些MFC框架、Qt框架为我们做了多少事情吧( ̄y▽, ̄)╭

    最后再把完整代码贴出来供大家借鉴

    三、完整代码

    #include<Windows.h>
    LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	case WM_CLOSE:
    		DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
    		break;
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {
    	WNDCLASS wndcls; //创建一个窗体类
    	wndcls.cbClsExtra = 0;//类的额外内存,默认为0即可
    	wndcls.cbWndExtra = 0;//窗口的额外内存,默认为0即可
    	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
    	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//设置光标
    	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//设置窗体左上角的图标
    	wndcls.hInstance = hInstance;//设置窗体所属的应用程序实例
    	wndcls.lpfnWndProc = WinSunProc;//设置窗体的回调函数,暂时没写,先设置为NULL,后面补上
    	wndcls.lpszClassName = L"test";//设置窗体的类名
    	wndcls.lpszMenuName = NULL;//设置窗体的菜单,没有,填NULL
    	wndcls.style = CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画
    	RegisterClass(&wndcls);//向操作系统注册窗体
    
    	
    	//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
    	HWND hwnd = CreateWindow(L"test", L"我的第一个窗口",
    		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    		NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hwnd, SW_SHOWNORMAL);//把窗体显示出来
    	UpdateWindow(hwnd);//更新窗体
    
    	MSG msg;
    	//消息循环
    	while (GetMessage(&msg, NULL, 0, 0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零
    	{
    		TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
    		DispatchMessage(&msg);//派发消息
    	}
    
    }
    
    

    四、更多

    欢迎点击下方关注我的公众号!持续更新软件、资源、以及技术文章!

    展开全文
  • C++ --- Windows屏幕和窗口截图

    千次阅读 2021-04-09 17:28:58
    最近学习了Windows下的屏幕截图,延伸到窗口截图,其中也遇到了不少的坑,好在最后还是实现了我的目标。顺便封装了一下Win32的api,方便后续使用。
  • Windows窗口及对话框

    千次阅读 2016-02-18 22:19:46
    1、Windows窗口介绍    在Windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来...而窗口之间的关系有种:owner-owned(拥有-被拥有关系)、 parent-child(父-子关
  • windows窗口分析,父窗口,子窗口,所有者窗口

    万次阅读 多人点赞 2016-12-14 11:50:57
    (本文尝试通过一些简单的实验,来分析Windows窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++、Windows编程及MFC经验,还得有一定动手能力。文中可能出现一些术语不统一的现象,比如“子窗口”,有...
  • 在Dev-C++ 5.11上创建并正常运行,操作系统32位、64位Win7均可。首先在文件菜单里新建项目,选择Windows Application,命名完成后得到程序框架。最后在代码中添加上控件和对应的事件即可。
  • Windows编程-创建窗口

    千次阅读 2016-08-04 23:10:22
    设计窗口类 注册窗口类 创建窗口 显示更新窗口 消息循环 编写回调函数——————————帅气的分割线—————————– 下面我们一步一步进行讲解: 1.设计窗口类WNDCLASS我们查看MSDN可以知道窗口类的成员...
  • 答案:通过FindWindow函数获取,参数有个,分别为窗口名和窗口所属的类名,输入一个即可,另一个可以为NULL。返回值是HWND类型。需要的头文件是#include &lt;Windows.h&gt;,库为user32.dll。 第二步,...
  • Windows窗口程序设计入门(C#版)

    万次阅读 多人点赞 2018-05-05 13:13:04
    这次用C#写个简单的窗口程序,这篇文章完全是面向新手的。 我简单说明一下我们要实现的功能: 有个窗体Form1和Form2,这个窗体里面都有一个TextBox和一个Button。 ①当单击Form1里面的Button时,加载出Form2...
  • 从0开始学习《Windows程序设计》:窗口窗口!!!

    千次阅读 多人点赞 2019-03-10 20:48:15
    一、消息框 在之前的学习中,我们通过MessageBox创建了一个消息框程序! 消息框是什么,消息框就是我们用来跟用户交流的界面...MyWindows.c -- 基本窗口模型 《Windows 程序设计(SDK)》视频教程 ----------------...
  • Windows编程---使用C/C++语言创建一个窗口

    万次阅读 多人点赞 2019-01-20 20:17:42
    可以添加下面条预编译指令 // 第一条的意思是程序入口点是wWinMainCRTStartup函数,这样我们就可以使用wWinMain函数替代常见的main函数 // 第二条的意思是生成Windows程序,就是不带小黑框的图形界面程序 #pragma ...
  • 令人生疑的Windows窗口消息WM_PAINT详解

    千次阅读 多人点赞 2021-10-24 11:33:36
    在做Windows应用程序开发时,我们要处理多个Windows窗口消息,其中WM_PAINT窗口绘制消息在我们自绘窗口时会频繁地用到。有很多新人遇到与WM_PAINT消息相关的InvalidateRect、UpdateWindow、BeginPaint、EndPaint等...
  • 在VS2015中,可以通过API函数获取Windows窗口中控件的信息,包括控件句柄、控件显示的文字以及控件类型等。其流程为,首先获取Windows指定窗口的句柄,之后通过回调函数遍历该窗口中的控件句柄,最后通过控件句柄...
  • C# WindowsForm程序同时启动多个窗口类

    千次阅读 2017-01-22 16:09:07
    C# WindowsForm程序同时启动多个窗口类
  • 新建一个文本文档,打开,Windows就会给这个文本文档的窗口临时分配唯一的一串数字来标识这个窗体,以区别于其他窗口,这串数字就叫句柄。因为句柄是临时随机分配的,所以每次虽然是打开同一个文件,但是分配到的一...
  • Windows窗口刷新机制详解

    千次阅读 2017-12-28 16:00:13
    1、Windows窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注...
  • [MFC]_在vs2019中使用MFC快速构建简单windows窗口程序 转自:葛木小舍先生,一只默默奋斗的小菜鸟,为了庆祝展翅翱翔的那天博客 https://www.cnblogs.com/gemuxiaoshe/p/12054099.html 微软基础类库(英语: ...
  • windows窗口类型

    千次阅读 2015-01-05 19:48:11
    Overlapped Windows 重叠窗口 Pop-up Windows 弹出窗口 Child Windows窗口 Layered Windows 分层窗口 Message-Only Windows 什么是层叠窗口 层叠窗口最典型的就是我们的一个应用窗口的主窗口,如果用WS_...
  • 1、摘要 Transformer在NLP领域取得不错表现,如何更好地处理图像成为行业所面临地问题。...移位窗口方案将自我注意计算限制在非重叠的局部窗口上,同时允许跨窗口连接,从而提高了效率。 ...
  • 在Table API和SQL中,主要有窗口:Group Windows和Over Windows 分组窗口(Group Windows) Group Windows 是使用 window(w:GroupWindow)子句定义的,并且必须由as子句指定一个别名。 为了按窗口对表进行...
  • 时间窗口(Time Windows)的原理和使用

    千次阅读 2020-11-03 16:26:13
    概述 flink中支持多种窗口,包括:时间窗口,session窗口,count窗口等,本文简单介绍这些窗口的原理,并通过例子说明如何使用这些窗口。...翻滚时间窗口的窗口是固定的,比如设定一个1分钟的时间窗口,该时
  • Windows 窗口层次关系

    千次阅读 2014-05-14 11:08:32
    相信在Windows 下面编程的很多兄弟们都不是很清楚Windows窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Windows 中桌面(Desktop...
  • Windows游戏开发感想&&一个完整的Windows窗口程序

    千次阅读 多人点赞 2017-03-31 15:18:28
    现在的互联网行业从事Windows游戏开发的人实在是太少了。一是因为门槛较高,游戏行业本来就是互联网行业最尖端的领域,要想从事游戏开发,不仅要掌握一门过硬的语言,尤其是对C++的精通,还要对算法非常精通,深刻...
  • unity 实现调用Windows窗口/对话框交互

    千次阅读 2018-05-16 23:59:49
    unity 实现调用Windows窗口/对话框交互 Unity调用Window窗口 本文提供全流程,中文翻译。助力快速完成 Unity调用 Window api 执行保存/打开操作 用来控制打开/保存项目文件 将个脚本放到项目中,分别绑定2个按钮 ...
  • windows如何实现圆角窗口

    千次阅读 2019-09-30 01:38:17
    windows做绘制时,为了美观,常常将一些图片或者窗口的四个角做成圆角。例如QQ窗口: 圆角的实现方案总结 其实总结起来非常的简单,就个步骤: 计算窗口的边界剪切域 通过windows API SetWindowRgn设置该窗口...
  • 主函数(windows 窗口应用程序)

    千次阅读 2014-01-26 23:26:02
     研究windows的主函数的时候,注册窗口,创建窗口,在主函数中调用结果显示不出来,最后查阅网络才明白,窗口回调函数是必须写好的,一开始我只是简单的写了返回0,调试很多次都不能够显示自己的窗口,最后才通过。...
  • 概述 flink中支持多种窗口,包括:时间...最简单常用的窗口形式是基于时间的窗口,flink支持种时间窗口: 一种是翻滚时间窗口(tumbling time window) 一种是滑动时间窗口(sliding time window) 翻滚时间窗口(t...
  • 用WinForm实现基本Windows桌面应用框架和简单的向导式窗口 Windows Form是用于创建传统Windows应用程序的基本工具,本工程使用C# Windows Form框架并以网上可免费下载到的优化UI组件库为基础创建。(控件原文地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 247,761
精华内容 99,104
关键字:

windows的两类窗口是