调整Access报告的大小,以acDialog打开,而隐藏主窗口

时间:2018-11-19 19:52:06

标签: c# ms-access report size

我正在使用C#应用程序中旧Access数据库中的表单和报表。 为此,我启动了Access数据库,隐藏了主窗口,并调用了一个在单独的窗口中打开表单或报表的过程。

我通过使用acDialog打开表单或报表来获得一个单独的窗口。 弹出表单也产生了一个单独的窗口,但没有弹出报告。

这些表单运行良好,但是除非在 Report_Open 中执行 DoCmd.Maximize ,否则我无法显示报告。

最大化会使报告占据整个屏幕,这是不理想的。 我希望将报告设置为我选择的大小,但是内置的Access命令 DoCmd.MoveSize 和Windows API SetWindowPos 都会导致报告重新加入主Access窗口,这是隐藏的。

我希望有人可以提出实现我目标的方法。

C#代码:

class Program
{
    private static readonly string DbLocation = "C:\\example.accdb";

    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
    private const int KeyDownEvent = 0x0000;
    private const int KeyUpEvent = 0x0002;

    static void Main(string[] args)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo()
        {
            FileName = GetOfficeAppPath("Access.Application", "msaccess.exe"),
            Arguments = DbLocation,
            WindowStyle = ProcessWindowStyle.Hidden
        };

        // Simulate holding the Shift key, while opening the application, to bypass startup proceedings.
        keybd_event((byte)Keys.LShiftKey, 0, KeyDownEvent, 0);
        Process process = Process.Start(startInfo);
        process.WaitForInputIdle();
        keybd_event((byte)Keys.LShiftKey, 0, KeyUpEvent, 0);

        Access.Application exampleApp = (Access.Application)Marshal.BindToMoniker(DbLocation);

        try
        {
            exampleApp.Run("OpenReport", 12345);
        }
        catch (Exception e)
        {
            MessageBox.Show($"{e.Message}\n{e.InnerException?.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            exampleApp.CloseCurrentDatabase();
            process.Kill();
        }
    }
}

0 个答案:

没有答案