获取 PrintDialog 的模式对话框句柄

2024-02-03

我在 .net 2.0 上有一个 Windows 应用程序。在Form1,我打开一个PrintDialog。如何从我的代码中获取该对话框的句柄?

我尝试了很多win32功能:EnumWindows, EnumChildWindows, FindWindow, FindWindowEx但它找不到我的PrintDialog。我能找到的只是Form1它的孩子是它的控制者。我没有办法得到PrintDialog's handle.

我尝试过的一些代码:

导入win32:

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

调用win32函数:

using (PrintDialog dlg = new PrintDialog
                                 {
                                     AllowCurrentPage = false,
                                     AllowSomePages = true,
                                     AllowSelection = false
                                 })
{    
      IntPtr printHandle = CustomPrintDialog.FindWindow("#32770", "Print");
      // some logic with printHandle go here
      if (dlg.ShowDialog(this)==DialogResult.OK){
          // some logic go here
      }
}

我用Spy++检查过,仍然有一个PrintDialog窗户。那PrintDialog窗口的父窗口句柄与Form1's handle.

有谁可以帮我得到一个PrintDialog's从其父窗口处理?


问题是底层窗口PrintDialog是在执行期间创建的ShowDialog方法。在调用该方法之前它并不存在,这就是为什么你找不到该窗口。 所以你必须将你的工作注入PrintDialog里面有把手ShowDialog。这可以通过以下方式实现Control.BeginInvoke method:

public partial class Form1 : Form
{
    ...

    private ShowPrintDialog()
    {
        using (var pd = new PrintDialog())
        {
            BeginInvoke(new MethodInvoker(TweakPrintDialog));
            if (pd.ShowDialog(this) == DialogResult.OK)
            {
                // printing
            }
        }
    }

    private void TweakPrintDialog()
    {
        var printDialogHandle = GetActiveWindow();
        // do your tweaking here
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr GetActiveWindow();
}

另一个问题是找到PrintDialog窗户。GetActiveWindow这确实是实现此目的的一种简单方法,因为对话框预计在ShowDialog正在行动。 更可靠的解决方案可能包括枚举顶级窗口并分析它们的所有者和/或其他道具。这是一种可能的方法,假设打印对话框是表单当前唯一的窗口。这TweakPrintDialog前面代码片段中的方法被修改:

    private void TweakPrintDialog()
    {
        uint processId;
        var threadId = GetWindowThreadProcessId(this.Handle, out processId);
        EnumThreadWindows(threadId, FindPrintDialog, IntPtr.Zero);
        // printDialogHandle field now contains the found handle
        // do your tweaking here
    }

    private IntPtr printDialogHandle;

    private bool FindPrintDialog(IntPtr handle, IntPtr lParam)
    {
        if (GetWindow(handle, GW_OWNER) == this.Handle)
        {
            printDialogHandle = handle;
            return false;
        }
        else
        {
            return true;
        }
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    private delegate bool EnumWindowProc(IntPtr handle, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool EnumThreadWindows(uint threadId, EnumWindowProc enumProc, IntPtr lParam);

    private const uint GW_OWNER = 4;

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr GetWindow(IntPtr handle, uint cmd);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 PrintDialog 的模式对话框句柄 的相关文章

  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 将整个文档移动到 iframe 中

    我想做的是将一个完整的网站包装在一个iframe不破坏任何样式或 JavaScript 这是我尝试过的 var frame css position fixed top 0 left 0 width 100 height 100 appen
  • Spring @Autowired 不工作 - BeanCreationException

    当我尝试在服务器上部署文件时发生错误 我很困惑 因为这段代码有效 例外 Failed to enable lec2ear 1 0 ear Unexpected HTTP response 500 Request address gt dep
  • 如何仅使用标准网络库发送 HTTP 响应?

    我正在 Web 编程课程中完成我的第一个作业项目 即用 Java 编写一个简单的 Web 服务器 我正处于来回传输数据的阶段 在未经训练的人看来 我的小型服务器似乎工作正常 但是 我找不到发送适当回复的方法 换句话说 无效的页面请求将显示
  • 现有字符串加倍

    如何将现有字符串更改为双精度字符串 我有这样的代码声明为字符串 但实际上它从数据库获取数字 我正在做数字转换 但现在我不想将其转换为字符串并将其一路获取为数字 private String example1 example1 new Str
  • 我可以拆分grails的config.groovy文件吗?

    由于里面有敏感代码config groovy文件 我担心我的朋友会犯这个文件中的错误 当得到svn更新后 我们也会得到有问题的配置代码 我可以将代码拆分为config groovy是否可以使敏感代码保持不变 而其他代码可以经常更改 在主配置
  • Matlab模拟:点(符号)从起点移动到终点并返回

    我想创建一个动画来演示基于 LDPC 编码和积算法 http en wikipedia org wiki Belief propagation 到目前为止 我已经创建了一个图表 显示符号节点 左 和奇偶校验节点 右 之间的连接替代文本htt
  • 您将如何使用 Sklearn 的 VotingClassifier 进行 RandomizedSearchCV ?

    我正在尝试调整我的投票分类器 我想在 Sklearn 中使用随机搜索 但是 由于我当前使用两种算法 不同的树算法 如何为我的投票分类器设置参数列表 我是否必须单独运行随机搜索并稍后在投票分类器中将它们组合在一起 有人可以帮忙吗 代码示例将受
  • Docker Maven Spotify 插件 - 可以切换到非安全注册表

    我正在使用Spotify Maven 插件 http mvnrepository com artifact com spotify docker maven plugin在执行某些 Maven 目标时自动构建和部署 docker 镜像 但是
  • jQuery if 语句,语法

    什么是一个简单的 jQuery 语句 该语句声明仅当 A 和 B 为 true 时操作才会继续 如果 A 不为真 则停止 如果 A 和 B 为真 则继续 jQuery 只是一个增强 Web 浏览器中 DOM 功能的库 底层语言是 JavaS
  • 使用 org.postgresql.core.Utils.escapeLiteral 足以防止 SQL 注入吗?

    在构建 SQL 查询和更新以提交到我的数据库之前 我需要清理一些用户输入的数据 我知道最好使用准备好的陈述 https www owasp org index php SQL Injection Prevention Cheat Sheet
  • 为什么 C++ 编译器不做更好的常量折叠?

    我正在研究加速大部分 C 代码的方法 该代码具有用于计算雅可比的自动导数 这涉及在实际残差中做一些工作 但大部分工作 基于分析的执行时间 是计算雅可比矩阵 这让我感到惊讶 因为大多数雅可比都是从 0 和 1 向前传播 所以工作量应该是函数的
  • 导入 R. (android)

    我已经通过 Stack Overflow 进行了搜索 因为我知道这是一个常见问题 但似乎没有一个解决方案适合我 这包括清理我的项目 删除所有导入 删除项目并完全重新开始 我正在使用 Eclipse 专门用于 mac 上的 android A
  • 使用最大流算法查找网络的边缘连通性

    我想使用最大流算法 Edmond Karp Ford Fulkerson 算法 找到无向图的边连通性 即要删除以断开图连接的最小边数 我知道我可以通过找到图的每两个节点之间的最小最大流量来完成此任务 但这将导致 O V 2 数量的流量网络
  • Twitter Bootstrap CSS 静态流体表单定位

    我正在使用 Twitter Bootstrap 框架尝试获得如下布局 现在看起来是这样的 jsFiddle 全屏 https jsfiddle net flackend YxKfc show jsFiddle https jsfiddle
  • Spring Boot 关闭钩子

    如何注册 添加在 Spring Boot 应用程序关闭时触发的自定义关闭例程 场景 我将 Spring Boot 应用程序部署到 Jetty servlet 容器 即没有嵌入式 Jetty 我的应用程序使用 Logback 进行日志记录 并
  • 夏令时持续时间

    我有一个对象Shift 有两个字段 startDateTime and endDateTime as DateTime来自乔达时间 我的轮班包括英国夏令时的变化 它开始于25 03 2017 13 00并结束于26 03 2017 02 0
  • 如何在C#中动态阻止网站?

    我想从用 C 编写的 Windows 服务动态阻止某些 URL 我不想通过写入主机文件来做到这一点 例如我想阻止该网址http example com 在所有浏览器中 但也会阻止http example com another早上 7 点到
  • Objective C /C 中的命名约定,以“_”开头?

    我看到 ppl 定义变量是这样的 b2World world b2Body body CCSprite ball 代替 b2World world b2Body body CCSprite ball 我熟悉第二个 但不熟悉第一个 于是 我查
  • css 显示:表格第一列太宽

    我有一个像这样的 css 表设置 div class table div span name span span details span div div 表格的 css 是 table display table width 100 ta
  • 获取 PrintDialog 的模式对话框句柄

    我在 net 2 0 上有一个 Windows 应用程序 在Form1 我打开一个PrintDialog 如何从我的代码中获取该对话框的句柄 我尝试了很多win32功能 EnumWindows EnumChildWindows FindWi