- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 .net 2.0 上有一个 Windows 应用程序。在 Form1
上,我打开了一个 PrintDialog
。如何从我的代码中获取该对话框的句柄?
我已经尝试了很多 win32 函数:EnumWindows
、EnumChildWindows
、FindWindow
、FindWindowEx
但它不能找到我的 PrintDialog
。我所能找到的只是 Form1
及其子控件。我无法获得 PrintDialog 的
句柄。
一些我试过的代码:
导入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 的
句柄完全相同。
谁能帮我从它的父窗口获取PrintDialog 的
句柄?
最佳答案
问题是 PrintDialog
的底层窗口是在 ShowDialog
方法执行期间创建的。它在调用此方法之前不存在,这就是您找不到窗口的原因。因此,您必须将您对 PrintDialog
句柄的工作注入(inject)到 ShowDialog
中。这可以在 Control.BeginInvoke
方法的帮助下实现:
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
运行时对话框应该处于事件状态。更可靠的解决方案可能包括枚举顶级窗口并分析其所有者和/或其他 Prop 。这是一种可能的方法,假设打印对话框是目前唯一由表单拥有的窗口。修改了前面代码段中的 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);
关于c# - 获取 PrintDialog 的模态对话框句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360213/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!