zoukankan      html  css  js  c++  java
  • windows.h系统函数

    转载:https://blog.csdn.net/u010756046/article/details/82432312

    // Windows系统函数.cpp: 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    #include <time.h>
    #include <tlhelp32.h>

    using namespace std;

    //SendMessage(hWnd,WM_CHAR,WPARAM('g'),0);//发送一个字符(按键)消息g给当前鼠标所指向的窗口句柄
    //参数 窗口句柄,WM_CHAR,要按下的键,0

    //SendMessage(wnd,WM_RBUTTONDOWN,0,0);//鼠标右键按下,第三,四个参数说明了鼠标按下时的位置
    //鼠标右键按下的消息类型是“WM_RBUTTONDOWN”,右键松开的消息是“WM_RBUTTONUP”


    //获取随机数 len随机数范围 [0,len)
    void random(const int len) {
    //头文件time.h 包含time clock函数
    //time获取1970年到现在的秒数
    //clock获取毫秒
    srand(time(0)+clock());//设置随机数种子
    while (1) {
    srand(time(0) + clock());//设置随机数种子
    int r = rand() % len;
    //cout << r << endl;
    if (r == 0 || r == len-1)cout << r << endl;
    }
    }
    //获取光标(Cursor)位置 根据光标位置获取窗口句柄
    void fun1() {
    while (1) {
    POINT p;//POINT 点 结构体
    GetCursorPos(&p);//获取 光标 Pos点(传入 点内存地址)
    HWND hwnd = WindowFromPoint(p);//窗口 来自 点(传入 结构体点)--返回值 HWND 窗口句柄
    cout <<"鼠标位置X:"<<p.x<<" Y:"<<p.y<<" 窗口句柄"<< hwnd <<endl;
    Sleep(100);
    }
    }

    //移动窗口 改变窗口大小 是否重绘
    void fun2() {
    HWND hwnd = FindWindowA("Notepad","无标题 - 记事本");
    //窗口句柄 x y w h 是否重绘
    bool b=MoveWindow(hwnd,1000,500,900,500,0);
    cout << "返回值" << b << endl;
    }

    //设置窗口显示状态,如隐藏,最大化,最小化
    void fun3() {
    HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
    ShowWindow(hwnd, SW_SHOWNORMAL);
    //SW_HIDE:隐藏窗口并激活其他窗口。并激活其他窗口?当隐藏用
    //SW_MAXIMIZE:最大化指定的窗口。
    //SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。
    //SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。
    //SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。
    //SW_SHOWNORMAL 正常显示
    }

    //设置鼠标的位置、把鼠标移动到指定的位置
    void fun4() {
    SetCursorPos(1042, 93);
    //srand(123);//设置随机数种子
    srand(time(0));//获取系统时间 设置随机数种子
    cout << rand() << endl;
    cout << rand() << endl;
    cout << rand() << endl;
    cout << rand() << endl;
    cout << rand() << endl;
    }

    //获得窗口大小
    void fun5() {
    HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
    RECT rect;//矩形 结构体
    //获取 客户端 矩形,参数1 窗口句柄,参数2 矩形指针,返回值 BOOL
    bool b1 = GetClientRect(hwnd, &rect);
    cout << "GetClientRect返回值" << b1 << endl;
    cout << "left:" << rect.left << endl; //0
    cout << "top:" << rect.top << endl; //0
    cout << "right:" << rect.right << endl;
    cout << "bottom:" << rect.bottom << endl;
    //因为与位置无关 所以left=0 top=0,right窗口宽度 bottom高度
    //注意:right bottom 为窗口实际的宽高

    cout << endl;

    //相对屏幕
    bool b2 = GetWindowRect(hwnd, &rect);
    cout << "GetWindowRect返回值" << b2 << endl;
    cout << "left:" << rect.left << endl;
    cout << "top:" << rect.top << endl;
    cout << "right:" << rect.right << endl;
    cout << "bottom:" << rect.bottom << endl;
    //right-left=宽度
    //bottom-top=高度
    cout << "" << rect.right - rect.left << endl;
    cout << "height:" << rect.bottom - rect.top << endl;
    //注意:width height 不是窗口实际的宽高(QQ截图用的就是这个函数,和QQ截图里计算的结果一样)
    }

    //运行一个程序
    void fun6() {
    //运行的程序启动路径为当前程序的启动路径

    //第一个参数hwnd是父窗口的句柄,可以为NULL
    //第二个参数lpOperation表示行为
    //第三个参数lpFile是程序的路径名
    //第四个参数lpParameters是给所打开程序的参数,可以为NULL
    //第五个参数lpDirectory可以为NULL
    //第六个参数nShowCmd跟ShowWindow函数的第二个参数一样,作用也一样,如果打开的程序有窗口的话,这个参数就指明了窗口如何显示SW_SHOWNORMAL(正常显示)

    //字符集:
    //字符集"open"使用的是ascii
    //L"open"使用的是unicode,L"open" 相当于 _T("open")

    //HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
    //ShellExecute(hwnd, L"open", _T("NOTEPAD.exe"), NULL, NULL, SW_SHOWNORMAL);
    //ShellExecute(0, L"open", _T("NOTEPAD.exe"), NULL, NULL, SW_SHOWNORMAL);
    //ShellExecute(0, L"open", _T("NOTEPAD.exe"), L"C:\Users\Liziguo\Desktop\新建文本文档.txt", NULL, SW_SHOWNORMAL);//传参 打开桌面的记事本
    //ShellExecute(0, L"open", _T("java"), L"-jar C:\Users\Liziguo\Desktop\windows.h.jar", NULL, SW_SHOWNORMAL);//传参
    //ShellExecute(0,L"open",L"http://www.liziguo.cn",0,0,SW_SHOWNORMAL);//打开一个网址
    //ShellExecute(0,L"open",L"C:",0,0,SW_SHOWNORMAL);//打开C盘
    //ShellExecute(NULL, L"open", L"g:\瓦力高清2.jpg", NULL, NULL, SW_SHOWNORMAL);//还可以根据文件后缀名选择相应的程序打开一个文件

    //类似的函数还有WinExec,只有两个参数, 它的最后一个参数跟ShellExecute函数的最后一个参数一样
    //WinExec("NOTEPAD.EXE", SW_SHOWNORMAL);
    //WinExec("java -jar C:\Users\Liziguo\Desktop\windows.h.jar", SW_SHOWNORMAL);//传参
    }

    //GetModuleFileName根据模块导入表获取程序的完整路径
    //CreateWindow创建窗口 跳过

    //GetDC根据窗口句柄获取设备上下文。得到了一个窗口的设备上下文,就可以进行画图操作了,像画圆,画正方形,显示图片等函数都是要设备上下文(DC)句柄做参数的。
    void fun7() {
    HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
    HDC dc = GetDC(0);//获取这个窗口的设备上下文
    while (1) {
    //在窗口里画矩形(窗口被刷新时消失)
    Rectangle(dc, 20, 20, 120, 120);//left top right bottom
    Sleep(50);
    }
    }

    //在光标指向的窗口画图
    void fun8() {
    POINT p;
    while (1) {
    GetCursorPos(&p);
    HWND hwnd = WindowFromPoint(p);
    HDC hdc = GetDC(hwnd);
    Rectangle(hdc, 20, 20, 120, 120);
    Sleep(50);
    }
    }

    //30.CreateToolhelp32Snapshot给当前进程拍一个照
    //Process32First根据CreateToolhelp32Snapshot函数返回的句柄获取进程信息

    //TerminateProcess结束一个进程
    void fun9() {
    HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
    DWORD id;
    GetWindowThreadProcessId(hwnd, &id);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, id);
    TerminateProcess(handle, 0);//第一个是进程句柄,第二个填0就行了

    }

    //CreatePen创建一个画笔(返回画笔句柄)CreateSolidBrush创建一个画刷。相当于fun8()设置了 画笔和画刷
    void fun10() {
    //函数定义:BOOL CreatePen(int nPenStyle, int nWidth, COLORREFcrColor);

    //第一个参数,表示是什么类型的线,取值有以下:
    //PS_SOLID 画笔画出的是实线 PS_DASH 画笔画出的是虚线(nWidth必须是1) PS_DOT 画笔画出的是点线(nWidth必须是1)
    //PS_DASHDOT 画笔画出的是点划线(nWidth必须是1) PS_DASHDOTDOT 画笔画出的是点 - 点 - 划线(nWidth必须是1)
    //第二个参数是画笔的宽度,第三个参数是画笔的颜色,COLORREF类型可以RGB来获得如RGB(233, 128, 88); 分别是红绿蓝。

    //如创建一个画笔:HPEN pen = CreatePen(PS_SOLID, 3, RGB(255, 78, 99));

    //----------------------------------------------------------------------------------------------------------
    //CreateSolidBrush创建一个画刷

    //只有一个COLORREF类型的参数

    //HBRUSH brush = CreateSolidBrush(RGB(22, 182, 111));
    POINT p;
    HPEN hpen = CreatePen(PS_DOT, 1, RGB(7, 47, 231));
    HBRUSH hbrush = CreateSolidBrush(RGB(220, 220, 12));
    while (1) {
    GetCursorPos(&p);
    HWND hwnd = WindowFromPoint(p);
    HDC hdc = GetDC(hwnd);
    SelectObject(hdc, hpen);//选入画笔
    SelectObject(hdc, hbrush);//选入画刷

    Rectangle(hdc, 20, 20, 120, 120);
    Sleep(1);
    }
    }

    //获取系统进程快照 获取系统所有进程
    void fun11() {
    /*
    进程信息结构体:
    typedef struct tagPROCESSENTRY32 {
    DWORD dwSize;//结构大小
    DWORD cntUsage;//此进程的引用计数
    DWORD th32ProcessID;//进程ID
    DWORD th32DefaultHeapID;//进程默认堆ID
    DWORD th32ModuleID;//进程模块ID
    DWORD cntThreads;//此进程开启的线程计数
    DWORD th32ParentProcessID;//父进程ID
    LONG pcPriClassBase;//线程优先权
    DWORD dwFlags;//保留
    char szExeFile[MAX_PATH];//进程名
    } PROCESSENTRY32;
    */

    //记住这种格式就行了,返回的句柄,存储有进程信息,可以用Process32Firs函数找出来。
    //头文件tlhelp32.h
    //HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    //创建 工具 帮助 32 快照
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//参数记住就行了,成功返回句柄 失败返回INVALID_HANDLE_VALUE(-1)
    if (handle == INVALID_HANDLE_VALUE) {
    cout << "获取当前系统进程快照失败" << endl;
    }
    PROCESSENTRY32 processentry32;//结构体:程序 进口 32
    //在使用这个结构之前,先设置它的大小
    processentry32.dwSize = sizeof(processentry32);

    bool b=Process32First(handle, &processentry32);
    while(b) {

    /*cout << "结构大小 " << processentry32.dwSize << endl;
    cout << "此进程的引用计数 " << processentry32.cntUsage << endl;
    cout << "进程ID " << processentry32.cntUsage << endl;
    cout << "进程默认堆ID " << processentry32.th32DefaultHeapID << endl;
    cout << "进程模块ID " << processentry32.th32ModuleID << endl;
    cout << "此进程开启的线程计数 " << processentry32.cntThreads << endl;
    cout << "父进程ID " << processentry32.th32ParentProcessID << endl;
    cout << "线程优先权 " << processentry32.pcPriClassBase << endl;
    cout << "保留 " << processentry32.dwFlags << endl;*/
    //cout << "进程名 " << processentry32.szExeFile << endl;
    printf("%ls ", processentry32.szExeFile);
    printf("进程ID号:%u ", processentry32.th32ProcessID);//th32ProcessID是进程ID号
    cout << endl;
    b=Process32Next(handle, &processentry32);

    }
    CloseHandle(handle);//列举完后,需要调用CloseHandle函数关闭系统进程句柄
    }

    //创建一个线程(多线程)
    DWORD _stdcall xiancheng(LPVOID lpvoid) {
    POINT p;
    while (1) {
    GetCursorPos(&p);
    HWND hwnd = WindowFromPoint(p);
    HDC hdc = GetDC(hwnd);
    Rectangle(hdc, 20, 20, 120, 120);
    Sleep(50);
    }
    }
    //创建一个线程(多线程)
    void fun12() {
    //第一个参数不用管它,填NULL
    //第二个参数dwStackSize用于新线程的初始堆栈大小,默认为0
    //第三个lpStartAddress填函数名(指标),但这个函数必须是这种固定格式的DWORD _stdcall xiancheng(LPVOID lpParameter), 新的线程将会执行这个函数里面的代码,直到函数结束,线程死亡
    //第四个lpParameter是一自定义参数,用户可以通过这个参数,传递需要的类型,这个参数与线程函数的参数相对应
    //第五个dwCreationFlags填0表示立即执行,如果是CREATE_SUSPENDED表示挂起,直到用ResumeThread函数唤醒
    //第六个lpThreadId填NULL就行了。
    CreateThread(0,0,xiancheng,0,0,0);
    Sleep(5000);//不管创建的线程是否结束 进程都会关闭
    }

    //获取当前进程ID
    void fun13() {
    cout << "当前进程ID:" << ::GetCurrentProcessId() << endl;
    }

    //在窗口输出一个位图
    void fun14() {
    BITMAP bmInfo;//这个结构存储位图信息
    HBITMAP bmp;
    bmp = (HBITMAP)LoadImage(NULL, L"G:\瓦力高清2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    //第一个参数hgdiobj是对象句柄,第二个参数cbBuffer是待写入lpvObject指针指向缓存区数据大小,第三个参数lpvObject是一个指针,指向一个缓存区。
    GetObject(bmp, sizeof(BITMAP), &bmInfo);//获取位图信息
    HWND wnd = FindWindow(L"Notepad", L"无标题.txt - 记事本");
    HDC hdc = GetDC(wnd);
    HDC memDC = ::CreateCompatibleDC(hdc);//创造兼容的DC
    SelectObject(memDC, bmp);//选入位图
    while (1)
    {
    BitBlt(hdc, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, memDC, 0, 0, SRCCOPY);//输出位图
    Sleep(200);
    }
    }

    //GetWindowText根据窗口句柄获得窗口标题名
    void fun15() {
    POINT p;
    wchar_t ch[100] = {0};
    while (1) {
    GetCursorPos(&p);
    HWND hwnd = WindowFromPoint(p);
    GetWindowText(hwnd, ch, 100);
    printf("%ls",ch);
    cout << endl;
    Sleep(100);
    }

    }

    //SetWindowText根据窗口句柄设置窗口标题名
    void fun16() {
    //HWND hwnd = FindWindowA("TXGuiFoundation", "Innocence.等3个会话");
    //SetWindowText(hwnd, L"李子果");
    SetWindowText((HWND)0x003E0670,L"李子果123");

    }

    //GetCurrentProcess获得当前线程句柄

    //OpenProcessToken获得一个进程的访问令牌句柄
    void fun17() {
    /*
    获得一个进程的访问令牌有什么用呢?主要是为了修改它的权限,前面在介绍结束一个进程的时候说过了,
    无法结束系统进程,是什么原因呢,原因是调用OpenProcess函数失败,无法获取系统进程句柄而引起的,
    那为什么会失败呢,权限不够,普通程序的进程没有SeDeDebug权限,而一个进程的权限是与访问令牌相关的,
    这样我们只要获取一个进程的访问令牌句柄,
    再以这个句柄为参数调用相应的函数提升进程的权限为SeDeDebug就可以获取系统进程句柄,进而结束它。
    */

    //第一个参数ProcessHandle待获取的进程句柄
    //第二个参数DesiredAccess操作类型,填TOKEN_ADJUST_PRIVILEGES就行了
    //第三个TokenHandle是访问令牌句柄的指针,该参数接收句柄

    //GetCurrentProcess()获取当前进程句柄,TOKEN_ADJUST_PRIVILEGES填这个,接收令牌的指针
    HANDLE handle;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&handle);

    //TOKEN_PRIVILEGES是描述进程权限的结构体

    //LookupPrivilegeValue函数查看对应系统权限的特权值,返回信息到一个LUID结构体里
    //第一个参数lpSystemName通常都填NULL,本地系统调用,第二个参数lpName填要查询的权限名,如要查询的是SeDeDebug权限则取值是SE_DEBUG_NAME,第三个参数lpLuid接收其取值。
    //如LUIDluid; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);


    //AdjustTokenPrivileges调整一个进程的访问令牌信息(权限)
    //第一个参数TokenHandle是令牌句柄
    //第二个是禁用所有权限标志,后面填FALSE就行了
    //第三个NewState是待刷进令牌句柄的PTOKEN_PRIVILEGES结构信息指针
    //第四个BufferLength指明TOKEN_PRIVILEGES结构大小
    //第五,六个参数填NULL就行了。
    }

    //提升权限 结束系统进程
    void fun18() {
    //那么结合上面两个函数,提升一个进程权限制,让它能够结束系统进程的代码就是:
    HANDLE handle;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &handle);
    TOKEN_PRIVILEGES tp;
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
    tp.PrivilegeCount = 1;//tp里其它一些属性设置
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(handle, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);

    DWORD id;
    GetWindowThreadProcessId((HWND)0x000806E6, &id);
    HANDLE ha = OpenProcess(PROCESS_ALL_ACCESS, false, id);
    cout << ha << endl;
    TerminateProcess(ha, 0);
    }

    //RegisterHotKey注册一个热键
    void fun19() {
    //第一个参数hWnd表明热键消息(HOT_KEY)发送给哪个窗口,为NULL表明直接把消息投递给调用这个函数进程的消息队列。
    //第二个参数可以自定取值,取值范围0xC000 - 0xFFFF, 这个参数是为了程序能同时拥有多个热键而存在。
    //第三个参数fsModifiers的可选取值如下:MOD_ALT(Alt键),MOD_CONTROL(Ctrl键),MOD_SHIFT(Shift键),MOD_WIN(‘田’图标键)
    //最一个参数是一个ASCII值,指明具体和哪个非系统键组合。
    //如QQ的热键ctrl+alt+z,注册这个热键的语句是RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_ALT,‘Z’)
    //如QQ的截图热键RegisterHotKey(NULL, 0x0001, MOD_CONTROL | MOD_ALT, 'A')
    }

    int main()
    {
    //fun5();
    //fun8();
    fun18();
    return 0;
    }


    ————————————————
    版权声明:本文为CSDN博主「李子果」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u010756046/article/details/82432312

  • 相关阅读:
    双指针算法_最长连续不重复子列长度
    前缀和_子矩阵的和
    前缀和
    高精度算法_大数除以小数
    高精度算法_大数乘小数
    高精度算法_大数相减
    高精度算法_大数加法
    一维差分矩阵
    二维差分矩阵
    整数二分
  • 原文地址:https://www.cnblogs.com/MCSFX/p/13154756.html
Copyright © 2011-2022 走看看