草庐IT

c# - 删除和恢复窗口边框

coder 2024-06-06 原文

我想在 C# 中删除另一个进程的窗口边框;我使用 RemoveMenu 删除边框。它几乎可以工作,但我还有 2 个问题:

  • 我需要移除边框两次,第一次菜单栏还在 存在。
  • 我无法恢复菜单的

这是我已经写的:

public void RemoveBorders(IntPtr WindowHandle, bool Remove)
    {
        IntPtr MenuHandle = GetMenu(WindowHandle);

        if (Remove)
        {
            int count = GetMenuItemCount(MenuHandle);
            for (int i = 0; i < count; i++)
                RemoveMenu(MenuHandle, 0, (0x40 | 0x10));
        }
        else
        {
            SetMenu(WindowHandle,MenuHandle);
        }

        int WindowStyle = GetWindowLong(WindowHandle, -16);

        //Redraw
        DrawMenuBar(WindowHandle);
        SetWindowLong(WindowHandle, -16, (WindowStyle & ~0x00080000));
        SetWindowLong(WindowHandle, -16, (WindowStyle & ~0x00800000 | 0x00400000));
    }

有人可以告诉我我做错了什么吗?我已经尝试保存 MenuHandle 并稍后恢复它,但这不起作用。

最佳答案

  • I can't restore the menu's

这是因为您的 MenuHandle 是本地变量。

当对方法 RemoveBorders 的第一次调用结束时,垃圾收集器会删除 MenuHandle 并释放内存。

第二次调用 RemoveBorders 时,MenuHandle 重新创建为新的本地 变量,并重新分配给窗口菜单的当前状态 - 一个没有菜单项的菜单.

结果:

MenuHandle 不保存窗口菜单的先前状态,这解释了为什么不能恢复窗口菜单。

我的建议是让 MenuHandle 成为全局变量,并在 RemoveBorders 方法定义之外定义它。

您可以将其定义为私有(private)、 protected 或公共(public)字段,还可以为其定义另一个属性,但这是可选的,不是必需的。如果此属性更适合您,您也可以将其定义为静态。

下面是 MenuHandle 定义的一些例子:

private IntPtr MenuHandle;
//or
IntPtr MenuHandle; //Defined outside of RemoveBorders, which is defined below this line, to show that MenuHandle is not local variable.
public void RemoveBorders(IntPtr WindowHandle, bool Remove)
//or
protected IntPtr MenuHandle;
//or
public IntPtr MenuHandle
//or
private static IntPtr MenuHandle
//or
static IntPtr MenuHandle
//etc...

你必须移动这条线:

IntPtr MenuHandle = GetMenu(WindowHandle);

内部:

if (Remove)

在调用 GetMenuItemCount 函数之前。

您还必须修改该行,至少删除 IntPtr,以声明 MenuHandle 不是 local 变量,并引用 MenuHandle < strong="">field,它是在 RemoveBorders 方法之外定义的。 IntelliSense 仍会将其识别为字段,并且不会提醒您未定义的错误。

如果 MenuHandle 是不是 static,那么您也可以添加this。删除 MenuHandle 之前的 IntPtr 关键字后(换句话说,您可以将 IntPtr 替换为 this.),以记住 MenuHandle 不是 < strong="">local 变量,因此垃圾收集器不会在 RemoveBorders 完成作业时删除它。

当您启动程序时,MenuHandle 将被分配给 IntPtr.Zero 作为默认值。当您第一次调用 RemoveBorders 时,MenuHandle 的值将设置为 if (Remove) 中 GetMenu 函数的返回值。

当 RemoveBorders 第一次 完成时,MenuHandle 不会被删除,并保存窗口菜单的先前状态,在所有项目被删除之前。

因此,当您第二次调用 RemoveBorders 以恢复菜单时,执行程序将到达 if (Remove) 代码并立即跳转到 else 代码,因为 remove = false,并且在那里你调用 SetMenu 函数,当你给它 previous 窗口菜单的状态时,因为 first 调用删除边框。 这样您就可以最终恢复窗口的菜单。

我仍然不明白为什么你需要删除边框两次,第一次菜单栏仍然存在。 我也想帮你解决这个问题,但是没有办法。 在这种情况下,您的代码是正确的。抱歉,但我希望其他人可以为您解决这个问题,并为您提供解决方案。

关于c# - 删除和恢复窗口边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10337680/

有关c# - 删除和恢复窗口边框的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  10. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

随机推荐