【问题标题】:Send text to "save as" dialog将文本发送到“另存为”对话框
【发布时间】:2017-07-25 07:33:06
【问题描述】:

我有 winapi c# 将网页保存为 pdf。应用程序在网页上使用 control + P 并按 Enter。我的默认打印机是“nuance pdf”,我想将文件另存为 pdf。我的代码如下所示:

static class Program
{
    [DllImport("user32.dll")]
    public static extern int SetForegroundWindow(IntPtr hWnd);

    [DllImport("User32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);

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

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [STAThread]
    static void Main()
    {
        Boolean Check = true;
        string text = "MyFileName";

        while (Check)
        {
            Process[] processes = Process.GetProcessesByName("iexplore");
            foreach (Process proc in processes)
            {
                SetForegroundWindow(proc.MainWindowHandle);
                SendKeys.SendWait("^(p)");
                SendKeys.SendWait("{ENTER}");
                var handle = FindWindow(null, "Save As");
                Console.WriteLine("handle {0}", handle);
                //SendMessage(handle, 0x000C, IntPtr.Zero, text);
                SendKeys.SendWait("{ENTER}");
            }
            Check = false;
        }
    }
}

此代码将文件名保存为“https___www.google.pdf”。我想更改文件名(突出显示)。

我该怎么做?任何指针? 感谢您的帮助。

【问题讨论】:

  • 这听起来像是System.Windows.Automation 的工作。
  • 谢谢雷蒙德。你有例子吗?
  • 你不能只发送Alt+n 键到对话框选择文件名框然后发送新文件名吗?
  • 在这个站点上有很多使用自动化命名空间的例子。 Here's one 使用它来单击按钮。 Here's one 使用 ValuePattern 更改编辑控件中的文本。
  • Stack Overflow 不能替代网络搜索和基础研究。当有人建议您使用 UI 自动化时,请先进行基础研究,然后再询问示例。一个称职的程序员的一个基本要求是勤奋和专注于进行此类研究。

标签: c# winapi


【解决方案1】:

鉴于您当前的方法,并且默认情况下会突出显示文本,为什么不直接发送带有您想要的文件名的密钥呢?

var handle = FindWindow(null, "Save As");
Console.WriteLine("handle {0}", handle);
SendKeys.SendWait(text);
SendKeys.SendWait("{ENTER}");

您可能需要先突出显示文本。可以是双击,也可以直接访问控件,例如var filename = FindEdit(handle, "File Name:") 在默认情况下未突出显示的情况下访问它。

【讨论】:

  • 这在操作系统的本地化版本上真的非常有用...请不要投票,甚至不要接受这个 hack 作为答案。
  • @IInspectable,我确实说过“鉴于 [the] current approach”。解决方案远非最佳,但在现有解决方案的范围内。我刚刚修改了用于输入文本的现有行,这在原始代码工作的任何系统上都可以。只需为 OP 提出的问题和现有代码提供一个可行的解决方案
  • 因此,本质上,您只是在向某人伸出援助之手,而后者正试图射中自己的脚。说真的,如果这是解决问题的唯一方法,那还可以。但是当有一个reliable solution,而你甚至没有提到它时,很难不把这个答案称为严重疏忽。
  • @IInspectable “我如何使用我必须做的事情......”与“我应该如何去做......”是一个非常不同的问题。鉴于 OP 提供的解决方案,这绝不是严重疏忽。它是解决简单问题的简单工具。不是每个人都在编写企业应用程序
  • 这不是论坛。这是一个面向专业软件开发人员的问答网站。答案对于访问该站点的任何人都应该是正确且有价值的,而不仅仅是 OP。在这种情况下,OP 要求 X,但确实需要解决 Y。这被称为XY Problem。一个有用的答案必须承认这一点。既然没有,“这个答案没用”。恐怕这需要投反对票。
猜你喜欢
  • 2018-04-26
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多