精华内容
下载资源
问答
  • 各种常用的 Win32Api 汇总(持续更新中. . .)

    千次阅读 多人点赞 2020-07-10 08:48:08
    Win32API 相关文章如下: Win32利用CreateEvent 实现简单的 —— 线程同步 Win32消息处理机制与窗口制作 Win32远程线程注入 .dll 文件 Win32删除目录下的所有文件 —— 递归遍历 (一)Win32服务程序编写 —— 使用...

    在这里插入图片描述
    作者:浪子花梦一个有趣的程序员 ~
    .

    Win32API 相关文章如下:

    Win32利用CreateEvent 实现简单的 —— 线程同步
    Win32消息处理机制与窗口制作
    Win32远程线程注入 .dll 文件
    Win32删除目录下的所有文件 —— 递归遍历
    (一)Win32服务程序编写 —— 使用SC命令创建与删除
    (二)Win32服务程序编写 —— 使用命令行参数创建与删除
    Win32使用快照、psapi.dll、wtsapi32.dll、ntdll.dll 四种方式实现 —— 枚举进程
    (一)Win32进程通信 —— 自定义消息实现
    (二)Win32进程通信 —— 内存映射文件
    (三)Win32进程通信 —— 数据复制消息
    (四)Win32进程通信 —— 剪贴板的使用
    (五)Win32进程通信 —— 匿名管道
    (六)Win32进程通信 —— 邮槽的使用


    常用的 Api汇总如下所示:

    线程与进程

    ZeroMmory 					// 初始内存
    CreateProcess 				// 创建进程
    GetWindowThreadProcessId	// 获取进程id
    OpenProcess					// 打开进程
    WriteProcessMemory			// 写进程中的数据
    getlasterror 				// 获取错误信息
    CloseHandle 				// 关闭句柄指向的内核对象计数器 - 1    为0时,内核对象消失
    SuspendThread(pi.hThread); 	// 挂起线程   暂停
    ResumeThread(pi.hThread); 	// 重新启动线程
    termilateprocess	 		// 终止进程
    GetModuleFileName			// 获取模块路径
    GetCurrentDirectory			// 获取工作路径
    GetCurrentProcessId			// 获取当前进程id
    GetCurrentProcess	 		// 获取当前进程句柄(伪句柄)
    GetCommandLine				// 获取命令行
    GetStartupInfo				// 获取启动信息
    EnumProcesses				// 遍历进程id
    CreateToolhelp32Snapshot 	// 快照
    CreateThread			 	// 创建线程
    WaitForSingleObject			// 等待单个对象
    WaitForMultipleObjects		// 等待多个对象
    GetExitCodeThread			// 获取线程返回值   判断是否成功执行线程
    GetThreadContext	 		// 获取线程上下文  寄存器原理
    SetThreadContext		 	// 设置线程上下文
    EnterCriticalSection	 	// 进入临界区
    LeaveCriticalSection	 	// 离开临界区
    CreateMutex					// 创建互斥体	通过 WaitforSingleObject 获取互斥体   // 访问临界资源  内核资源   令牌
    RealseMutex					// 释放互斥体
    CreateEvent					// 创建事件		通知类型
    SetEvent				 	// 设置事件有信号
    ResetEvent					// 设置事件无信号
    

    GUI GDI

    CreatePen					// 创建画笔对象
    SelectObject		 		// 关联对象
    MoveToEx					// 线起始位置
    LineTo						// 线终止位置
    GetStockObject				// 获取画刷
    SetDCBrushColor				// 设置画刷颜色
    Rectangle					// 画矩形
    ReleaseDC					// 释放 HDC
    DeleteObject		 		// 删除对象
    CreateFont					// 创建字体对象
    TextOut						// 写字
    OutputDebugString			// 输出调式字符串
    
    BeginPaint					// 开始绘画
    EndPaint					// 结束绘画
    
    // 按钮类控件
    BM_SETCHECK   BM_GETCHECK		// 按钮消息
    SetWindowText	GetWindowText	// 设置  获取窗口名称
    ShowWindow		IsWindowVisible	// 判断窗口可见  设置窗口可见
    EnableWindow	IsWinodwEnable	// 判断窗口可用  设置窗口可用
    
    
    // 组合按钮切换图形颜色
    GetClientRect			// 获取窗口4个顶点
    CreateSolidBrush		// 创建画刷颜色
    InvaliddataRect			// 窗口失效 配合UpdateWindow使用
    
    
    // 文本相关API
    SetTextAlign			// 设置文本对齐方式
    TextOut					// 输出文本
    TabbedTextOut			// 可以输出Tab键的文本
    ExtTextOut				// 文本(背景色、剪裁、间距)
    // 类似word中设置文本
    DrawText				// 在矩形中画出文本内容(多种对齐方式)适用于大量文本
    DrawTextDx				// 扩展了边距操作
    
    // 文本的设备环境属性
    SetTextColor			// 设置文本颜色
    SetBkColor				// 设置背景颜色
    SetBkMode				// 设置背景模式
    SetTextCharacterExtra	// 字符间距
    
    // 选择字体
    ChooseFont				// 选择字体对话框   (结构大小、逻辑字体、标志屏幕字体、字体类型屏幕)
    CreateFontIndirect		// 返回字体句柄(参数为逻辑字体)
    CreateFont				// 创建字体
    EnumFrontFamilies		// 枚举字体
    
    // 画线
    MoveToEx				// 改变画笔位置
    LineTo					// 线的终点
    Polyline				// 多条边
    Arc						// 画弧线 (后两个参数在矩形版面)
    PolyBezier				// 贝塞尔曲线(花里胡哨)
    
    // 画图
    Rectangle				// 画矩形
    RoundRect				// 圆角矩形
    Ellipse					// 椭圆
    Chord					// 弦形
    Pie						// 饼形
    Polygon					// 多边形
    PolyPolygon				// 多个多边形
    SetPolyFillMode			// 设置多边边内部填充模式
    
    // 矩形的各种骚操作
    RECT					// 矩形顶点的结构点
    FillRect				// 填充矩形
    FrameRect				// 填充框架
    InvertRect				// 翻转矩形的颜色
    SetRect					// 设置RECT的值
    OffsetRect				// 偏移矩形
    InflateRect				// 矩形变大/变小
    SetRectEmpty			// 设置矩形的值为空
    IsRectEmpty				// 判断矩形是否为空
    IntersectRect			// 两个矩形的交集
    UnionRect				// 两个矩形的并集
    PtlnRect				// 判断点是否在矩形中
    

    在这里插入图片描述


    Winodw

    GetClassName				// 获取窗口类名
    SendMessage					// 发送消息
    FindWindow					// 查找窗口
    EnumWindows					// 枚举所有窗口
    
    GetVersionEx				// 获取系统版本
    GetSystemInfo				// 获取硬件信息
    
    GetSystemDirectory			// 获取系统目录 
    GetWindowsDirectory			// 获取Windows 安装目录
    GetUserName					// 获取用户名
    GetComputerName				// 获取计算机名
    SystemParametersInfo		// 外设信息
    
    GetLocalTime				// 获取本地时间
    SetLocalTime				// 设置本地时间
    GetTickCount				// 获取开机到现在的时间(毫秒)
    GetTickCount64				// 64位
    
    
    // 注册表
    RegCreateKey	RegCreateKeyEx		// 创建新项
    RegOpenKey		RegOpenKeyEx		// 打开一个项
    RegQueryValue	RegQueryValueEx		// 访问项的值 
    RegDeleteKey		RegDeleteKeyEx	// 删除一个项
    RegCloseKey							// 关闭句柄
    

    Memory

    VirtualAlloc					// 开辟私有内存	(进程独有的内存空间) Private	
    VirtualFree					// 私有内存释放
    CreateFileMapping			// 开辟物理页  不与虚拟内存链接
    MapViewOfFile				// 链接	
    UnMapViewOfFile				// 关闭文件资源
    FlushMapViewOfFile			// 刷新缓冲区	
    OpenFileMapping				// 打开一个共享
    // 真正的开辟内存只有这两个函数,molloc  new  在分配好的内存上 再分配   假分配
    

    Heap Memory

    HeapCreate				// 预定内存,返回一个句柄
    HeapAlloc				// 分配内存
    HeapFree				// 释放内存
    

    文件系统

    一、卷相关API

    GetLogicalDrives				// 获取逻辑驱动器   获取卷
    GetLogicalDriveStrings			// 获取所有盘符的字符串
    GetDriveType					// 获取驱动器的类型
    GetVolumeInformation			// 获取驱动器的信息
    

    二、目录相关 API

    CreateDirectory				// 创建目录
    RemoveDirectory				// 删除目录
    MoveFile			 		// 修改目录名称
    SetCurrentDirectory			// 设置当前目录所在位置
    GetCurrentDirectory			// 获取当前目录名称
    

    三、文件相关 API

    CreateFile						// 创建一个文件
    GetFileSize						// 获取文件大小
    GetFileAttributesEx				// 获取文件属性
    FileTimeToSystem				// 文件时间  系统时间
    SetFilePointer					// 文件索引位置
    ReadFile						// 读取文件
    WriteFile						// 写入文件
    CopyFile						// 拷贝文件
    DeleteFile						// 删除文件
    FindFirstFile					// 搜索第一个文件
    FindNextFile					// 搜索下一个文件
    FindClose						// 关闭查找句柄
    

    静态库与动态库的使用

    在这里插入图片描述

    环境变量

    GetEnvironmentStrings			// 获取系统中的所有环境变量
    GetEnvironmentVarlable			// 获取某一个环境变量
    SetEnvironmentVarlable			// 增加、修改、删除某一个环境变量
    

    三连一波 ^ _ ^

    展开全文
  • import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 handle = win32gui.FindWindow("Notepad", None)  # 获取窗口...

    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还可用于监听鼠标和键盘事件的输入

     

    作者:Mr.Read

    出处:http://www.cnblogs.com/MrRead/

     

    展开全文
  • Win32对话框中使用Tab控件

    千次阅读 2019-06-15 16:46:49
    一个tab控件折腾好久才勉强能用,还有好多问题存在。暂且将已经实现的记录下来。 首先,初学windows编程,就算知道了一个控件的所有信息,没有示例,学起来也是很迷茫的。msdn官网方文档中有一个叫using...的模块,...

    windows编程学习任重而道远。一个tab控件折腾好久才勉强能用,还有好多问题存在。暂且将已经实现的记录下来。

    首先,初学windows编程,就算知道了一个控件的所有信息,没有示例,学起来也是很迷茫的。msdn官网方文档中有一个叫using...的模块,很有帮助。

    就像上方所示,参考using tab controls中的示例代码,能让初学者在使用控件的时候省力不少。

    tab控件在dialog和window中的使用方法不同。常规操作中,在window中,为tab的每一页创建或绑定一个子window,而在对话框的使用中,为tab的每一页绑定一个子对话框。

    笔者编写的是基于对话框的程序,所以需要为每一页绑定一个子对话框。

    依据官方文档给出的做法,首先定义一个struct,用以存储tab的信息。

    #define C_PAGES 3 
    
    typedef struct tag_dlghdr { 
        HWND hwndTab;       // tab control 
        HWND hwndDisplay;   // current child dialog box 
        RECT rcDisplay;     // display rectangle for the tab control 
        DLGTEMPLATEEX *apRes[C_PAGES]; 
    } DLGHDR; 

    struct中的各项定义的含义代码后面的注释已经给出,相当清除,此处不再赘述。

    但笔者在使用的时候出现了一个问题。就是找不到DLGTEMPLATEEX的头文件,不知要引入何种头文件才能使用它。在网上搜寻了一番也无果。最后还是看文档中给出的说法解了疑惑。这里说明认真阅读官方文档是很重要的一件事,很多东西人家都说的很清楚了,不去仔细看却到网上一通乱找,及其浪费时间。

    DLGTEMPLATEEX结构体用以描述扩展对话框,并且指定其控件个数。在官方文档中有这样一句话:The DLGTEMPLATEEX structure is not defined in any standard header file. 

    即它不在标准库中定义。至于其在哪里定义,网上似乎有些线索,不过俺没搜出来。笔者的做法是自己将该结构体定义出来。

    typedef struct {
      WORD      dlgVer;
      WORD      signature;
      DWORD     helpID;
      DWORD     exStyle;
      DWORD     style;
      WORD      cDlgItems;
      short     x;
      short     y;
      short     cx;
      short     cy;
      sz_Or_Ord menu;
      sz_Or_Ord windowClass;
      WCHAR     title[titleLen];
      WORD      pointsize;
      WORD      weight;
      BYTE      italic;
      BYTE      charset;
      WCHAR     typeface[stringLen];
    } DLGTEMPLATEEX;

    这样结构体就不缺了。本来以为之后就可以快快乐乐地进行下一步了,却发现sz_Or_Ord并非一个标准文档中的类型,该类型在哪里定义,或是其是何含义,皆不知道。在官网上找,只知道其为16位元素组成的可变长度的数组。一通搜索,发现有位仁兄如此定义:

    #define sz_Or_Ord WORD

    很有效,可以使用。并且在结构体定义的其他变量中,此方法也很适用。所以完美无错的结构体定义如下:

    #define C_PAGES 4
    #define sz_Or_Ord WORD
    #define titleLen 30
    #define stringLen 30
    typedef struct {
    	WORD      dlgVer;
    	WORD      signature;
    	DWORD     helpID;
    	DWORD     exStyle;
    	DWORD     style;
    	WORD      cDlgItems;
    	short     x;
    	short     y;
    	short     cx;
    	short     cy;
    	sz_Or_Ord menu;
    	sz_Or_Ord windowClass;
    	WCHAR     title[titleLen];
    	WORD      pointsize;
    	WORD      weight;
    	BYTE      italic;
    	BYTE      charset;
    	WCHAR     typeface[stringLen];
    } DLGTEMPLATEEX;

    到这一步,我们用来描述tab及其子页关系的结构体 DLGHDR 就可以使用了。

    在初始化父类对话框的时候,也就是收到WM_INITDIALOG消息时,进行初始化tab的操作。

    一般我们使用对话框程序的时候,在资源视图中已经将要用的对话框都画号了,所以初始化tab的时候,无需创建,直接利用GetDlgItem来获取tab控件的句柄。

    // Handles the WM_INITDIALOG message for a dialog box that contains 
    //   a tab control used to select among three child dialog boxes.
    // Returns a result code.
    // hwndDlg - handle of the dialog box.
    // 
    HRESULT OnTabbedDialogInit(HWND hwndDlg) 
    { 
        INITCOMMONCONTROLSEX iccex;
        //官方文档有,但如果在对话框中画好了tab,则以下代码不需要。
       // DWORD dwDlgBase = GetDialogBaseUnits();
       // int cxMargin = LOWORD(dwDlgBase) / 4; 
       // int cyMargin = HIWORD(dwDlgBase) / 8; 
    
        TCITEM tie; 
        RECT rcTab; 
        HWND hwndButton; 
        RECT rcButton; 
        int i; 
    
        // Initialize common controls.
        iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
        iccex.dwICC = ICC_TAB_CLASSES;
        InitCommonControlsEx(&iccex); 
    
        // Allocate memory for the DLGHDR structure. Remember to 
        // free this memory before the dialog box is destroyed.
        DLGHDR *pHdr = (DLGHDR *) LocalAlloc(LPTR, sizeof(DLGHDR)); 
    
        // Save a pointer to the DLGHDR structure in the window
        // data of the dialog box. 
        SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) pHdr); 
     
     //官方文档有,但如果在对话框中画好了tab,则以下代码不需要。
        // Create the tab control. Note that g_hInst is a global 
        // instance handle. 
        /*pHdr->hwndTab = CreateWindow( 
            WC_TABCONTROL, L"", 
            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 
            0, 0, 100, 100, 
            hwndDlg, NULL, g_hInst, NULL 
            ); */
        if (pHdr->hwndTab == NULL) 
        {
            return HRESULT_FROM_WIN32(GetLastError());
        }
     
        // Add a tab for each of the three child dialog boxes. 
        tie.mask = TCIF_TEXT | TCIF_IMAGE; 
        tie.iImage = -1; 
        tie.pszText = L"First"; 
        TabCtrl_InsertItem(pHdr->hwndTab, 0, &tie); 
        tie.pszText = L"Second"; 
        TabCtrl_InsertItem(pHdr->hwndTab, 1, &tie); 
        tie.pszText = L"Third"; 
        TabCtrl_InsertItem(pHdr->hwndTab, 2, &tie); 
    
        // Lock the resources for the three child dialog boxes. 
        pHdr->apRes[0] = DoLockDlgRes(MAKEINTRESOURCE(IDD_FIRSTDLG)); 
        pHdr->apRes[1] = DoLockDlgRes(MAKEINTRESOURCE(IDD_SECONDDLG)); 
        pHdr->apRes[2] = DoLockDlgRes(MAKEINTRESOURCE(IDD_THIRDDLG)); 
    
        // Determine a bounding rectangle that is large enough to 
        // contain the largest child dialog box. 
     //官方文档有,但如果在对话框中画好了tab,则以下代码不需要。
    /*
        SetRectEmpty(&rcTab); 
        for (i = 0; i < C_PAGES; i++) 
        { 
            if (pHdr->apRes[i]->cx > rcTab.right) 
                rcTab.right = pHdr->apRes[i]->cx; 
            if (pHdr->apRes[i]->cy > rcTab.bottom) 
                rcTab.bottom = pHdr->apRes[i]->cy; 
        }
    
        // Map the rectangle from dialog box units to pixels.
        MapDialogRect(hwndDlg, &rcTab);
        */
    //官方文档没有,笔者添加,但此处代码有误,虽然能运行且有预期效果,但并非最佳方案,有一个bug,相信你看了我增加的代码,就知道bug出在哪里
        GetWindowRect(pHdr->hwndTab,&rcTab);
        rcTab.top=rcTab.top+50;
    
        // Calculate how large to make the tab control, so 
        // the display area can accommodate all the child dialog boxes. 
        TabCtrl_AdjustRect(pHdr->hwndTab, TRUE, &rcTab); 
     //官方文档有,但如果在对话框中画好了tab,则以下代码不需要。
     //   OffsetRect(&rcTab, cxMargin - rcTab.left, cyMargin - rcTab.top); 
     
        // Calculate the display rectangle. 
        CopyRect(&pHdr->rcDisplay, &rcTab); 
        TabCtrl_AdjustRect(pHdr->hwndTab, FALSE, &pHdr->rcDisplay); 
     
        // Set the size and position of the tab control, buttons, 
        // and dialog box. 
     //官方文档有,但如果在对话框中画好了tab,则以下代码不需要。
      /*  SetWindowPos(pHdr->hwndTab, NULL, rcTab.left, rcTab.top, 
                rcTab.right - rcTab.left, rcTab.bottom - rcTab.top, 
                SWP_NOZORDER); */
     //这里随便啦,该程序除了tab,还有两个Button控件,所以要更改他们的位置。笔者程序中没有,所以没加,在这里一并注释掉
    /*
        // Move the first button below the tab control. 
        hwndButton = GetDlgItem(hwndDlg, IDB_CLOSE); 
        SetWindowPos(hwndButton, NULL, 
                rcTab.left, rcTab.bottom + cyMargin, 0, 0, 
                SWP_NOSIZE | SWP_NOZORDER); 
     
        // Determine the size of the button. 
        GetWindowRect(hwndButton, &rcButton); 
        rcButton.right -= rcButton.left; 
        rcButton.bottom -= rcButton.top; 
     
        // Move the second button to the right of the first. 
        hwndButton = GetDlgItem(hwndDlg, IDB_TEST); 
        SetWindowPos(hwndButton, NULL, 
            rcTab.left + rcButton.right + cxMargin, 
            rcTab.bottom + cyMargin, 0, 0, 
            SWP_NOSIZE | SWP_NOZORDER); 
     
        // Size the dialog box. 
        SetWindowPos(hwndDlg, NULL, 0, 0, 
            rcTab.right + cyMargin + (2 * GetSystemMetrics(SM_CXDLGFRAME)), 
            rcTab.bottom + rcButton.bottom + (2 * cyMargin)
            + (2 * GetSystemMetrics(SM_CYDLGFRAME)) 
            + GetSystemMetrics(SM_CYCAPTION), 
            SWP_NOMOVE | SWP_NOZORDER); 
     */
        // Simulate selection of the first item. 
        OnSelChanged(hwndDlg); 
    
        return S_OK;
    } 
    
    // Loads and locks a dialog box template resource. 
    // Returns the address of the locked dialog box template resource. 
    // lpszResName - name of the resource. 
    //
    DLGTEMPLATEEX* DoLockDlgRes(LPCTSTR lpszResName) 
    { 
        HRSRC hrsrc = FindResource(NULL, lpszResName, RT_DIALOG); 
    
        // Note that g_hInst is the global instance handle
        HGLOBAL hglb = LoadResource(g_hInst, hrsrc);  
        return (DLGTEMPLATEEX *) LockResource(hglb); 
    }

    以上就是获取tab控件,并且将其与子对话框绑定的代码,子对话框是提前画好的,给一个id就可以。

    tab控件有了,也绑定了子对话框。那么如何实现在点击某tab button的时候,显示对应的内容呢。。

    代码如下。

    // Processes the TCN_SELCHANGE notification. 
    // hwndDlg - handle to the parent dialog box. 
    //
    VOID OnSelChanged(HWND hwndDlg) 
    { 
        // Get the dialog header data.
        DLGHDR *pHdr = (DLGHDR *) GetWindowLong( 
            hwndDlg, GWL_USERDATA); 
    
        // Get the index of the selected tab.
        int iSel = TabCtrl_GetCurSel(pHdr->hwndTab); 
     
        // Destroy the current child dialog box, if any. 
        if (pHdr->hwndDisplay != NULL) 
            DestroyWindow(pHdr->hwndDisplay); 
     
        // Create the new child dialog box. Note that g_hInst is the
        // global instance handle.
        pHdr->hwndDisplay = CreateDialogIndirect(g_hInst, 
            (DLGTEMPLATE *)pHdr->apRes[iSel], hwndDlg, ChildDialogProc); 
    
        return;
    }

    以上的函数可在TCN_SELCHANGE notify时使用,可实现点击对应的tab button切换页面。其中“ChildDialogProc”就是子对话框的DialogProc函数,这里没有示例定义,寄几为对应的子对话框定义一个就可以。

    但如何保证子对话框很听话地躺在tab页面上?需要调整子对话框地位置,以下代码需要在子对话框初始化时调用。

    // Positions the child dialog box to occupy the display area of the 
    //   tab control. 
    // hwndDlg - handle of the dialog box.
    //
    VOID WINAPI OnChildDialogInit(HWND hwndDlg) 
    { 
        HWND hwndParent = GetParent(hwndDlg);
        DLGHDR *pHdr = (DLGHDR *) GetWindowLong( 
            hwndParent, GWL_USERDATA); 
        SetWindowPos(hwndDlg, NULL, pHdr->rcDisplay.left,
            pHdr->rcDisplay.top,//-2,
            (pHdr->rcDisplay.right - pHdr->rcDisplay.left),
            (pHdr->rcDisplay.bottom - pHdr->rcDisplay.top),
            SWP_SHOWWINDOW);
            
        return;
    }

    这样就完美了。

    但需要说明的是,本程序有一个bug有待解决。笔者实在太笨,没有找到获取在父控件中子控件的位置的方法,并且也没有找到如何让子对话框随父对话框的移动而相对位置不变的方式。程序运行后,如果移动了父对话框,那tab页中的子对话框是不会移动的,还停留在原地,因为最初给的是相对于屏幕的位置信息,并且也没有对在父对话框移动的时候,子对话框的动作做处理。

    还不是那么特别完美,若有改进,会进行更新。若此文章有幸被您看到,又特别巧地您知道如何解决,又特别特别巧地您愿意告知,不胜感激!

     

    展开全文
  • win32 创建tab控件

    2019-10-11 10:40:54
    平常都是用mfc,今天要用win32操作Dialog,从网上借鉴别人的代码, 已经完成,记录一下,方便以后熟悉。 1:CreateDialog(hInst, (LPCTSTR)IDD_MAIN, 0, (DLGPROC)MainDlgProc); 调用这个函数,用已经再资源模板画...

    平常都是用mfc,今天要用win32操作Dialog,从网上借鉴别人的代码, 已经完成,记录一下,方便以后熟悉。

    1:CreateDialog(hInst, (LPCTSTR)IDD_MAIN, 0, (DLGPROC)MainDlgProc); 调用这个函数,用已经再资源模板画好的对话框创建一个dialog

    2:在IDD_MAIN对话框资源上添加一个TAB控件,然后再添加几个对话框资源。

    3:在MainDlgProc消息处理函数里面,收到WM_INITDIALOG消息的时候,初始化TAB控件

    4:直接通过GetDlgItem获取TAB控件的窗口句柄,然后依次插入标签,再创建对应标签的对话框,并移动对话框到合适位置。

    注意,对话框的属性设置为child,否则,当主窗口移动的时候,TAB里面的对话框不会跟随移动。伪代码如下:

        hWnd= GetDlgItem(hWnd, IDC_TAB);    
        if (NULL == hWnd)
        {      
            return FALSE;
        }
        // 定义一个二维数组 存放tab标签名字
        char *tabname[3] = { "TAB1","TAB2","TAB3"}; 
        //具体开始设置 tie的字段 Mask psztext,ccxtextmax,image,lparam
        TCITEM tie;
        tie.mask = TCIF_TEXT | TCIF_IMAGE;//psztext字段有效
        tie.iImage = -1;
        for (int i = 0; i < 3; i++)
        {
            tie.pszText = tabname[i];
            TabCtrl_InsertItem(hWnd, i, &tie);
        }
         在tab标签中显示 别的控件
        RECT rect;
        GetClientRect(hWnd, &rect);
        int nDialogResourceID[3] = { IDD_PAGE1,IDD_PAGE2,IDD_PAGE3 }; 
        // 将两个窗口往 tab控件位置移动
        for (int i = 0; i<3; i++)
        {
            g_page_hwnd[i] = CreateDialog(g_hInst, (LPCTSTR)nDialogResourceID[i], g_table_hwnd, DlgProc[i]);       
            MoveWindow(g_page_hwnd[i], rect.left+1,rect.top+22, rect.right - rect.left-3, rect.bottom - rect.top-22, FALSE);
        }

       ShowWindow(g_page_hwnd[0], SW_SHOW);

    展开全文
  • 使用Tab controls window api 函数实现简单界面 vc6.0 windows api Tab Control
  • 推荐微软的Spy++来查看窗口类名...import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 handle = win32gui.FindWindow("Notepad", N
  • Python win32api.keybd_event模拟键盘输入

    万次阅读 2019-09-24 17:46:39
    Python win32api.keybd_event模拟键盘输入 win32api.keybd_event 该函数原型:keybd_even...
  • 注意:键值比对在文章最下面 键盘输入 ...win32api.keybd_event(36,0,win32con.KEYEVENTF_KEYUP,0) # 组合键输入ctrl+A # 注意:先按下的要后抬起 win32api.keybd_event(17,0,0,0) #ctrl按下...
  • // Win32Project1.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Win32Project1.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 WCHAR szTitle[MAX_L...
  • win32 API 实现登陆输入框

    千次阅读 2013-04-15 18:48:53
    很多应用程序都需要输入框,让用户输入特定信息,最近在学习win32API编程,在实现输入框时摸索了一阵子,这里将怎样用WIN32 API实现输入框记录下来,方便初学者共同提高。  我实现了一个demo程序,在应用程序...
  • Win32API编程_切换窗口

    千次阅读 2018-06-01 16:12:59
    返回值: 返回获取到的窗口句柄 SwitchToThisWindow 函数原型: VOID SwitchToThisWindow(HWND hWnd//窗口句柄, BOOL fAltTab //TRUE 表示使用 Alt/Ctl+Tab 键的先后次序来切换窗口,否则设为 FALSE。)TRUE 表示...
  • Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。...import win32api classname = "MozillaWindowClass" titlename = "百度一下,你就知道 ...
  • 背景: 拦截windows系统键盘输出,通过组合键设置,将常用的操作、需要打开的程序、文件,简化为两次按键 已实现的功能 对于普遍用户来说,这个小工具最受欢迎的功能应该是Tab+g了,它可以在你在电脑的任何地方,...
  • Win32控件-------Tab控件基本架构

    千次阅读 2015-05-08 17:30:02
    顺便说一句:SetWindowLongPtr()函数可以兼容32位和64位模式,而SetWindowLong()只能是32位模式 以下是实现了一个Tab和Page,程序的结构: WndProc()------> InitTabControl()-------> ...
  • C 可以直接调用的Win32API

    千次阅读 2018-11-13 08:15:40
    C 可以直接调用的Win32API
  • python控制键盘鼠标操作1.下载pywin32 点我下载...PyWin32 Documentation 点我传送PyWin32 Documentation ActiveState Docs 点我传送 Win32 How Do I…? by Tim Golden 点我传送3.举个简单的栗子#coding:utf-8''' Fu
  • 在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种...这里主要是通过两个Windows API函数来实现的。下面以 VC++为例来介绍一下如何实现这两个功能。  模拟键盘我们用Keybd...
  • 如题,废话不多说直接上代码: # _*_coding:UTF-8_*_ ''' date: 2019.04.26/2019.04.30 author: Antrn crack tb slide-captcha ...import win32api import win32con import win32gui from ctypes import * imp...
  • python win32 模拟按键

    2020-12-31 17:22:18
    import win32api import win32con key_map = { "0": 49, "1": 50, "2": 51, "3": 52, "4": 53, "5": 54, "6": 55, "7": 56, "8": 57, "9": 58, 'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115, 'F5': 116, 'F6': ...
  • 例说WIN32 Tab控件使用

    千次阅读 2013-07-14 19:19:55
    今天查找了一天关于SDK下,TAB控件的使用,到处都是C++的,本人还没开始学习C++,所以只能学习SDK方式使用TAB控件,搞了一天终于搞定了 ,现在在这里记录下,以便后来人有需要。 先直接上效果图: 就是当点击...
  • C# Win32API 模拟鼠标移动及点击事件

    万次阅读 2016-11-03 21:13:49
    C# Win32API 模拟鼠标移动及点击事件
  • WIN32api总结

    2016-05-04 21:32:00
    1.鼠标操作: win32api.SetCursorPos(...win32api.mouse_event(win32con.MOUSEEVENT_LEFTDOWN,0,0,0,0) win32api.mouse_event(win32con.MOUSEEVENT_LEFTUP,0,0,0,0) 2.键盘操作: win32api.keybd_even...
  • pywin32用spy++工具查找到句柄,再结合PyUserInput就...import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 handle = win32gui...
  • The Win32 API, or Application Programming Interface, is of immense use in extending the power of Visual Basic. The Win32 API is the collection of functions and subroutines that provides programmatic ...
  • TCM Tab control  TTM Tooltip control  TVM Tree-view control  UDM Up-down control WM General window  3、自定义消息:值在WM_USER以上的消息。 2. SendMessage/...
  • WIN32 API GetLastError()返回值含义列表

    千次阅读 2015-04-20 10:32:47
    32 进程无法访问文件,因为另一个程序正在使用此文件。 33 进程无法访问文件,因为另一个程序已锁定文件的一部分。 36 用来共享的打开文件过多。 38 到达文件结尾。 39 ...
  • 1 import webbrowser ... 2 import win32api 3 import win32gui 4 import time 5 6 #Define the url address 7 url_baidu_home = "http://www.baidu.com/" 8 url_baiduNews_tags = "http://news....
  • HBuilderX运行必要文件之一,没有他的话无法运行HBuilderX,这会非常非常的难受,所以啊,这个东西是必不可少的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,269
精华内容 4,907
关键字:

apitabwin32