Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 挂起时覆盖窗口未正确绘制_Winapi_Hook_Overlay - Fatal编程技术网

Winapi 挂起时覆盖窗口未正确绘制

Winapi 挂起时覆盖窗口未正确绘制,winapi,hook,overlay,Winapi,Hook,Overlay,要求是在另一个应用程序窗口的一侧绘制我的信息。 处理z顺序等等,钩住消息并在WM上画画似乎很好 然而,一些WM_绘画是为我关注的窗口区域设计的,而其他WM_绘画则是为完全不同的东西设计的,比如上下文菜单或按钮 示例记事本上挂有一个覆盖层,将“Hello”写入记事本屏幕。这个很好用。但是,当右键单击记事本时,上下文菜单将覆盖Hello。基本上上下文菜单被破坏了 有没有一种优雅的方法来确定WM_PAINT是什么上下文菜单 LRESULT CALLBACK overlayHook(int code,

要求是在另一个应用程序窗口的一侧绘制我的信息。 处理z顺序等等,钩住消息并在WM上画画似乎很好

然而,一些WM_绘画是为我关注的窗口区域设计的,而其他WM_绘画则是为完全不同的东西设计的,比如上下文菜单或按钮

示例记事本上挂有一个覆盖层,将“Hello”写入记事本屏幕。这个很好用。但是,当右键单击记事本时,上下文菜单将覆盖Hello。基本上上下文菜单被破坏了

有没有一种优雅的方法来确定WM_PAINT是什么上下文菜单

LRESULT CALLBACK overlayHook(int code, WPARAM wParam, LPARAM lParam) {
    //Try and be the LAST responder to WM_PAINT messages;
    LRESULT retCode = CallNextHookEx(hhk, code, wParam, lParam);

    //Per GetMsgProc documentation, don't do anything fancy
    if(code < 0) {
        return retCode;
    }

    //Assumes that target application only draws when WM_PAINT message is
    //removed from input queue.
    if(wParam == PM_NOREMOVE) {
        return retCode;
    }

    MSG* message = (MSG*)lParam;
    if(message->message != WM_PAINT) {
        //Ignore everything that isn't a paint request
        return retCode;
    }

    PAINTSTRUCT psPaint;    
    BeginPaint(message->hwnd, &psPaint);
    HDC hdc = psPaint.hdc;
    RECT r = psPaint.rcPaint;           
    TextOut(hdc, 10, 10, "Hello", 4);
    EndPaint(message->hwnd, &psPaint);
    return retCode;
}
LRESULT回调overlayHook(int-code、WPARAM-WPARAM、LPARAM-LPARAM){
//尝试成为WM_PAINT消息的最后响应者;
LRESULT retCode=CallNextHookEx(hhk,code,wParam,lParam);
//根据GetMsgProc文档,不要做任何花哨的事情
如果(代码<0){
返回代码;
}
//假设目标应用程序仅在显示WM_PAINT消息时绘制
//已从输入队列中删除。
if(wParam==PM_NOREMOVE){
返回代码;
}
消息=(消息*)LPRAM;
如果(消息->消息!=WM_PAINT){
//忽略所有不是喷漆请求的内容
返回代码;
}
PAINTSTRUCT-psPaint;
开始绘制(消息->hwnd和psPaint);
HDC HDC=psPaint.HDC;
RECT r=psPaint.rcPaint;
文本输出(hdc,10,10,“你好”,4);
EndPaint(消息->hwnd和psPaint);
返回代码;
}

仅测试绘图更新区域是不够的,因为上下文菜单可能在任何地方,并且包含我关心的区域。

我不知道有什么优雅的方法可以做到这一点,但可以使用GetWindowLong()获取窗口的样式,或使用GetClassName()获取其类名,然后根据这些值做出筛选决定。

GetClassName很有用。其他的建议是welcom。简单地在非子窗口上绘制覆盖层怎么样?