我正在使用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();
}
}
}