获取 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++ 中的嵌套词法作用域可访问的作用域中声明静态信息?

    我想声明范围的标识符 该标识符将用于自动填充最内部范围内任何日志记录语句的字段 它们通常会 但并非总是如此 例如 lambda 使用 引入的块 匹配封闭块的 名称 用法看起来像这样 namespace app LOG CONTEXT app
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 终止以 System.Diagnostic.Process.Start("FileName") 启动的进程

    我正在尝试创建一个将在特定时间执行操作的应用程序 很像 Windows 任务计划程序 我当前正在使用 Process Start 来启动任务所需的文件 或 exe 我通过调用文件 mp3 启动一个进程 该进程启动 WMP 因为它是默认应用程
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • boost变体简单调用常用方法

    我有两个指针 只能设置其中之一 所以我正在考虑使用 boost variant 例如 boost variant
  • 在 .NET Core 上通过 MEF 将参数传递给插件构造函数?

    我花了几个小时试图弄清楚如何通过 MEF System Composition 将参数传递给插件构造函数 但一切都无济于事 不用说 相关文档很少 查看源代码也没有帮助 这曾经非常容易做到 使用 CompositionHost Compose
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 仅打印字符串中的元音

    我是Python新手 我正在尝试打印字符串中的所有元音 因此 如果有人输入 嘿 一切都好吗 所有元音都需要打印 但我不知道怎么做 所以这不是计算元音 而是打印元音 现在我已经得到了这个 sentence input Enter your s
  • 对嵌套属性使用 XmlAttributeOverrides

    我试图使用 XmlAttributeOverrides 来控制类序列化后哪些类属性出现在 xml 中 它适用于 根 类上的属性 但不适用于嵌套属性 这是一个简单的例子来说明我想要完成的任务 我的类层次结构如下 public class Ma
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备

随机推荐

  • 将整个文档移动到 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