♂♂♂ 2021-12-29 19:13 采纳率: 100%
浏览 31
已结题

C++如何将窗口夹在图标层与背景层之间 win7

如题
代码如下,但无法实现,如何修改?

#include <windows.h>
#include <Winuser.h>
#include <stdio.h>
#include <wingdi.h>
RECT winrect;
int deskwidth;
int deskheight;
HDC winhdc;
HBRUSH hbrush;
//回调函数声明
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HWND GetBackground(){
    HWND hwnd = FindWindowA("progman","Program Manager");
    HWND worker = NULL;
    do{
        worker = FindWindowExA(NULL,worker,"workerW",NULL);
        if(worker != NULL){
            char buff[200] = {0};
            int ret = GetClassNameA(worker,(PCHAR)buff,sizeof(buff)*2);
            if(ret == 0){
                return NULL;
            }
        }
        if(GetParent(worker) == hwnd){
            return worker;
        }
    }while(worker != NULL);
    return NULL;
}
void SetFather(HWND child){
    HWND hwnd = GetBackground();
    if(hwnd == NULL){
        SendMessage(hwnd,0x052C,0,0);
        hwnd = GetBackground();
    }
    if(hwnd != NULL){
        SetParent(child,hwnd);
    }
}
 
void printbj(){
    //FillRect(winhdc, &winrect, hbrush);
    TextOutA(winhdc, 700, 500, "哈哈哈", 6);
}
//Win32应用程序入口
int WINAPI WinMain(
    HINSTANCE hInstance,      // 当前应用程序实例
    HINSTANCE hPrevInstance,  // 32位程序没用,总为0
    LPSTR lpCmdLine,          // 命令行参数
    int nCmdShow              // 显示状态
)
{
    GetClientRect(GetDesktopWindow(),&winrect);//获取桌面大小
    deskwidth = winrect.right - winrect.left;
    deskheight = winrect.bottom - winrect.top;
    hbrush = CreateSolidBrush(RGB(255, 255, 255));//创建画刷
    char szTitle[] = "背景显示器";
    char szClassName[] = "显示背景";
 
    // 1.设计窗口类
    WNDCLASS wndcls; //窗口类
 
    //填写窗口类相应的信息(必要)
    wndcls.cbClsExtra = 0;  //类的额外附加字节数
    wndcls.cbWndExtra = 0;  //窗口额外的附加字节数
    wndcls.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); //背景颜色
    wndcls.hCursor = LoadCursor(NULL,IDC_ARROW); //光标样式
    wndcls.hIcon = LoadIcon(NULL,IDI_WINLOGO);   //图标样式
    wndcls.hInstance = hInstance;           //实例句柄
    wndcls.lpfnWndProc = WindowProc;        //回调函数,由系统调用
    wndcls.lpszClassName = szClassName;        //窗口类名称
    wndcls.lpszMenuName = NULL;             //菜单名字
    wndcls.style = CS_HREDRAW | CS_VREDRAW; //窗口类型,这里是水平重画跟垂直重画
 
    // 2.注册窗口类
    RegisterClass(&wndcls);
 
    // 3.创建窗口
    HWND hwnd;
    hwnd=CreateWindow(
             szClassName,         //窗口类名称,必须跟上面填写的一样,否则显示不了窗口
             szTitle,             //窗口标题
             WS_OVERLAPPEDWINDOW, //指定要创建的窗口的样式
             0,0,                 //窗口位置
             deskwidth,deskheight,             //窗口大小
             NULL,                //父窗口
             NULL,                //菜单
             hInstance,           //实例句柄,WinMain函数参数
             NULL                 //窗口创建数据
         );
 
    // 4.显示窗口
    winhdc = GetWindowDC(hwnd);
    //SetLayeredWindowAttributes(hwnd,0,(255*70)/150,LWA_ALPHA);//设置窗口透明
    SetFather(hwnd);//设置窗口位置
    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow(hwnd); //刷新窗口
    //printbj();
 
    // 循环获取消息
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg); //转换消息(如:WM_CHAR),只会产生新的消息,不会销毁原由消息
        // WM_CHAR消息由WM_KEYDOWN消息和WM_KEYUP消息组成
        DispatchMessage(&msg);  //将消息传给窗口回调函数
    }
    return 0;
}
 
//回调函数,处理各种消息,由系统调用
LRESULT CALLBACK WindowProc(
    HWND hwnd,      // 窗口句柄
    UINT uMsg,      // 指定消息类型
    WPARAM wParam,  // 第一个消息参数
    LPARAM lParam   // 第二条消息参数
)
{
    switch(uMsg)
    {
    case WM_PAINT:                                    /* 窗口重绘消息 */
        HDC hDC;
        PAINTSTRUCT ps;
        hDC = BeginPaint(hwnd,&ps);               //指定窗口进行绘图工作的准备
        EndPaint(hwnd,&ps);                       //绘图结束,释放绘图区
        /*
        BeginPaint和EndPaint只能在WM_PAINT消息中使用,不能在其它消息在使用
        BeginPaint和EndPaint是一对的,BeginPaint函数创建的DC不能用ReleaseDC去释放
        GetDC获取到的DC也不能使用EndPaint来释放
        */
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam); //缺省消息处理,必不可少!
    }
    return 0;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 1月6日
    • 创建了问题 12月29日

    悬赏问题

    • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
    • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
    • ¥15 有没有整苹果智能分拣线上图像数据
    • ¥20 有没有人会这个东西的
    • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
    • ¥30 航迹分离,航迹增强,误差分析
    • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
    • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
    • ¥15 LLM accuracy检测
    • ¥15 pycharm添加远程解释器报错