草庐IT

c++ - 如果我过早获得窗口句柄,控制台窗口会出现问题……?

coder 2024-06-06 原文

我正在制作一个必须无边界的控制台应用程序;为此,我更改了控制台窗口样式和窗口区域,如下所示。
在某些时候,我遇到了一个问题,使控制台窗口通常显示大约 2x1 个字符的大小,或者有时完全被窃听(不可见的客户区、一些部分是白色的、一些部分是透明的、随机边框等)
有人告诉我,将 ShowWindow(hWnd, SW_HIDE); 添加到它现在所在的行可以解决问题。确实如此。
现在我想弄清楚为什么问题首先存在,以及是否有其他方法可以防止它?

有人告诉我,这个问题可能会发生,因为 Windows 正试图在访问我的程序的同时访问窗口属性(位置、样式、大小等)。不过,我不知道这是不是真的。

#include <Windows.h>
#include <iostream>
int main()
{
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);

    SMALL_RECT srWnd = {0, 0, 1, 1};
    SetConsoleWindowInfo(hCon, 1, &srWnd);
    COORD cBuffSize = {81, 26};
    SetConsoleScreenBufferSize(hCon, cBuffSize);
    srWnd.Top = 0;
    srWnd.Right = 80;
    srWnd.Bottom = 25;
    srWnd.Left = 0;
    SetConsoleWindowInfo(hCon, 1, &srWnd);

    // When the next two lines are moved so that they are the first two lines inside main(), the window gets bugged.
    HWND hWnd = GetConsoleWindow();
    ShowWindow(hWnd, SW_HIDE); // Or if you just remove this line

    RECT rClnt;
    GetClientRect(hWnd, &rClnt);

    SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
    LONG exStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
    exStyle &= ~(WS_EX_CLIENTEDGE | WS_EX_APPWINDOW);
    SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle | WS_EX_TOOLWINDOW);

    rClnt.right += 1;
    HRGN rgnClnt = CreateRectRgnIndirect(&rClnt);
    SetWindowRgn(hWnd, rgnClnt, 1);

    RECT rScrn;
    GetWindowRect(GetDesktopWindow(), &rScrn);
    SetWindowPos(hWnd, HWND_TOPMOST, rScrn.right / 2 - rClnt.right / 2, rScrn.bottom / 2 - rClnt.bottom / 2, 0, 0, SWP_NOSIZE | SWP_FRAMECHANGED);

    ShowWindow(hWnd, SW_SHOW);

    std::cin.get();
    return 0;
}

最佳答案

这是 Windows 8 的工作示例。但是每次移动/调整大小/恢复控制台时,您都需要刷新窗口区域。

#include <windows.h>
#include <tchar.h>
#include <conio.h>
#include <dwmapi.h>

//#pragma comment(lib, "uxtheme.lib")
#pragma comment(lib, "dwmapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    HWND hWnd = GetConsoleWindow();
    DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
    DwmSetWindowAttribute(hWnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof(DWMNCRENDERINGPOLICY));
    //SetThemeAppProperties(0);
    //SetWindowThemeNonClientAttributes(hWnd, STAP_VALIDBITS, 0);
    //SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED);
    //RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
    RECT rClnt, rWnd;
    GetClientRect(hWnd, &rClnt);
    GetWindowRect(hWnd, &rWnd);
    POINT pt = {0,0};
    MapWindowPoints(hWnd, NULL, &pt, 1);
    OffsetRect(&rClnt, pt.x-rWnd.left, pt.y-rWnd.top);
    HRGN rgnClnt = CreateRectRgnIndirect(&rClnt);
    SetWindowRgn(hWnd, rgnClnt, 1);

    _getch();
    return 0;
}

关于c++ - 如果我过早获得窗口句柄,控制台窗口会出现问题……?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059707/

有关c++ - 如果我过早获得窗口句柄,控制台窗口会出现问题……?的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  7. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  8. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  9. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐