jjzjj

c# - 从 "select mode"获取控制台窗口以防止崩溃

coder 2024-06-05 原文

在我的 C# 应用程序中,我试图防止我的应用程序崩溃,基本上,我使用控制台窗口作为日志显示窗口。我已经通过禁用关闭窗口解决了“关闭按钮”问题,并且我使用 Show 和 Hide 调用显示/隐藏菜单,所有这些都工作正常。

我最后的障碍是,如果文本选择处于事件状态并且窗口试图隐藏。

我要么需要:

一个。将窗口踢出选择模式。 (不确定我会怎么做,因为选择会暂停所有输出。)

B.以我禁用关闭菜单的相同方式禁用“编辑”菜单,希望它也能禁用鼠标选择,但我还没有找到任何方法来删除“编辑”菜单,我什至不确定这会阻止鼠标选择。

C.这似乎是最明显的,禁用鼠标选择,这是我目前在我的代码中的一个,但它不起作用,所以我不确定我错过了什么。

有问题的代码:

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 ....
[DllImport("Kernel32.dll", ExactSpelling = true)]
private static extern int SetConsoleMode(IntPtr hWnd, int wFlag);
 ....
public static void HideConsoleLog () {
    if (handle != IntPtr.Zero) {
        SetConsoleMode(handle, 0x0080);  // ENABLE_EXTENDED_FLAGS 0x0080
        ShowWindow(handle, (int)WinCntrlOpt.SW_HIDE);
        LogVisible = false;
    }
}

根据Documentation :

ENABLE_EXTENDED_FLAGS 0x0080 Required to enable or disable extended flags. See ENABLE_INSERT_MODE and ENABLE_QUICK_EDIT_MODE.

还有……

ENABLE_QUICK_EDIT_MODE 0x0040 This flag enables the user to use the mouse to select and edit text.

To enable this mode, use ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS. To disable this mode, use ENABLE_EXTENDED_FLAGS without this flag.

所以,看起来我这样做是正确的,它确实运行了,但它不会阻止鼠标选择。我知道不久前,Microsoft tinkered with Consoles ,我不知道这是否打破了这一点。

有一个similar question在堆栈交换上,但这下层提供了一个可行的解决方案,实际上与我在 C 或 C++ 中尝试做的相反。我可以进行插值,但这基本上是我已经在这里尝试过的。

这似乎是相同的建议,使用不带任何其他标志的 ENABLE_EXTENDED_FLAGS 来禁用该选项,这就是我的建议。但它不起作用。

所以,我要么抓错了解决方案,要么没有正确地做其他事情。

效果是,当控制台窗口打开时,您可以使用鼠标选择文本,这会自动将控制台置于微软修补添加的“选择模式”。这不是问题,但是当它处于该模式时,并且您选择“显示日志”(主应用程序窗口中的一个选中标记的切换菜单选项)控制台窗口确实隐藏了,但是主窗口随后锁定并应用程序崩溃。 (我的猜测是因为窗口被该选择模式挡住了。)当“选择模式”未处于事件状态时它不会崩溃。

我也想从同一份文档中尝试这个:

ENABLE_MOUSE_INPUT 0x0010 If the mouse pointer is within the borders of the console window and the window has the keyboard focus, mouse events generated by mouse movement and button presses are placed in the input buffer. These events are discarded by ReadFile or ReadConsole, even when this mode is enabled.

问题是,它说:

When a console is created, all input modes except ENABLE_WINDOW_INPUT are enabled by default.

那么,我该如何禁用它呢?

我可以接受任何将其踢出选择模式或阻止它开始的解决方案,我已经尝试过了。

最佳答案

当“显示日志”菜单选项被选中时,窗口将最小化。 在窗口最小化之前,您必须检查用户是否选择了任何输入以防止崩溃。您可以使用 GetConsoleSelectionInfo 检查用户是否正在选择任何内容.

CONSOLE_SELECTION_INFO out 参数应该等于0x00,如果不是,则需要处理选择。作为来自 GetConsoleMode 的文档/SetConsoleMode显示,您要么需要调用 ReadFileReadConsole丢弃可能正在进行的选择事件。

当你实现它时,它应该不会再崩溃了。

关于c# - 从 "select mode"获取控制台窗口以防止崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54604320/

有关c# - 从 "select mode"获取控制台窗口以防止崩溃的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. 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)(人们推荐的最少

  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-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  9. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  10. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

随机推荐