2013-06-02 3 views
5

Я пытаюсь получить Microsoft Access для «выхода» из основного окна Access, чтобы я мог скрыть окно Access и просто показать форму на рабочем столе, чтобы его можно легко разместить рядом с другими приложениями.Использование SetParent для выхода из Access Access из Access

Сначала я нашел образцы кода, которые используют собственное свойство Form.PopUp Access, но это невозможно установить во время выполнения, только в режиме просмотра. Хотя это, кажется, добиться того, что я пытаюсь сделать, есть два недостатка:

  1. Переключение между режимами просмотра дизайна и нормального зрения требуется «закрытие» окно между ними - я предпочел бы держать его открытым, чтобы сохранить текущее состояние, особенно когда оно используется для создания новых записей, которые обязательно являются несохраненными.

  2. Я хочу открыть другие формы из основного, что также не очень хорошо работает с этим подходом, если они тоже не установлены как «всплывающие окна». Но это хлопот, так как они также должны быть помещены в дизайн-представление и т. Д., И я не уверен, что было бы легко переключаться между двумя всплывающими окнами.

Я тогда нашел функцию API под названием SetParent, которая, казалось, делала то, что мне нужно. Я использовал следующие команды (VBA синтаксис):

SetParent ShowForm.hWnd 
ShowWindow hWndAccessApp, SW_HIDE 
ShowWindow ShowForm.hWnd, SW_SHOWNORMAL 

Но я столкнулся с двумя проблемами (возможно, связанные:

  1. окно, казалось бы, а отвечать на запросы (я не мог ввести в него, ., например, и нажимая на кнопки, кажется, не работает, либо)

  2. Когда я сделал ALT + TAB, я получил BSOD:

    BugCheck 1000008E, {c0000005, 9e3573f5, 88d9da10, 0} 
    Probably caused by : win32k.sys (win32k!xxxNextWindow+3a6) 
    at win32k!EngLineTo+1a641 
    

Есть ли другой способ сделать это, чтобы я мог иметь форму без окна доступа, которое может вызывать и отображать другие формы доступа за пределами основного окна доступа?

Я заметил в SetParent API Documentation, что есть еще несколько вещей, которые нужно сделать - изменение состояния пользовательского интерфейса и изменение стиля окна, но я не могу найти правильные методы для их выполнения. Будет ли это исправлять проблему BSOD и не реагирования?

Спасибо за любые идеи!

+0

@JanW: ​​Я не уверен, что ваша проблема имеет много общего с этим вопросом (что касается одной формы и возможности использования проектного представления). Примечание: см. Http://stackoverflow.com/a/24638829/3820271 о том, как удалить большинство элементов интерфейса Access. – Andre

+0

@JanW: ​​Мой ответ решает исходный вопрос. Я не знаю, поможет ли это вам в достижении вашей цели. Если нет, я предлагаю вам задать новый вопрос, конкретно касающийся ваших требований, поскольку они несколько отличаются от того, что было задано здесь. – PhilS

ответ

0

Я делаю то же самое, но с C#, в основном у меня есть панель вкладок, где я помещаю окна MS Access внутри, я могу нажимать на кнопки, но я все еще работаю над вводом текстовых полей, по какой-то причине это не работает, я могу проверить флажки и делать другие вещи без проблем ..

В любом случае, если вы можете оставить мне свой адрес электронной почты или каким-то образом, я могу связаться с вами, мы сможем работать вместе, у 2 человек есть лучшие шансы разобраться, на данный момент, что сделано ive:

 SetParent([Access window handle], [current handle from my tab page]); 
     SetWindowPos([Access window handle], 0, 0, 0, this.Width, this.Height, 0x0001); 
     SetWindowLong([Access window handle], -16, 4194304); 
+0

Это ответ? – techuser

+0

Это не ответ, а сообщение кем-то другим с тем же вопросом. Я предполагаю, что он был добавлен как ответ из-за ограничений переполнения стека для новых пользователей, которые пишут комментарии. @Rick Я не рассматривал эту проблему уже несколько месяцев. Я думаю, что в конце концов я решил придерживаться варианта 1 моего вопроса, так как я действительно не знаю Windows API. Похоже, что у StackOverflow нет способа отправить прямые сообщения, что затрудняет его работу - я не совсем уверен, как наилучшим образом дать мне надежную контактную информацию. Есть идеи? – ec2011

1

Основная проблема вопроса может быть решена с помощью следующего кода. - Однако есть некоторые ограничения (см. Ниже).

Я бы предложил вам вставить этот код в новый модуль VBA, но вы можете поместить его в модуль формы.

Private Const GWL_STYLE As Long = -16 

Private Const WS_CHILD As Long = &H40000000 
Private Const WS_POPUP As Long = &H80000000 

Private Const SW_HIDE As Long = 0 
Private Const SW_SHOW As Long = 5 
Private Const SW_MINIMIZE As Long = 6 

Private Declare PtrSafe Function SetParent Lib "User32.dll" (ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr 
Private Declare PtrSafe Function SetWindowLong Lib "User32.dll" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr 
Private Declare PtrSafe Function GetWindowLong Lib "User32.dll" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr 
Private Declare PtrSafe Function ShowWindow Lib "User32.dll" (ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As Boolean 

Public Sub MakePopupWindow(ByVal hWnd As LongPtr) 

    Dim windowStyle As LongPtr 

    Call SetParent(hWnd, 0) 

    windowStyle = GetWindowLong(hWnd, GWL_STYLE) 
    windowStyle = windowStyle Xor WS_CHILD 
    windowStyle = windowStyle Or WS_POPUP 

    Call SetWindowLong(hWnd, GWL_STYLE, windowStyle) 

    Call ShowWindow(Application.hWndAccessApp, SW_HIDE) 
    Call ShowWindow(hWnd, SW_SHOW) 

End Sub 

Этот код превратит любую форму доступа к PopUp типа формы, которые могут быть перемещены за пределы главного окна доступа. Он установит родительское окно формы в окно рабочего стола и удалит стиль окна WS_CHILD и добавит стиль WS_POPUP.

Код может быть вызван в любое время и не требует каких-либо конкретных настроек времени разработки. Чтобы вызвать код в любой форме, просто вызовите метод MakePopupWindow и передайте ему hWnd целевой формы.

Текущая реализация имеет некоторые ограничения:

1.) Окно документа Вариант текущей базы данных должен быть установлен на Перекрытие Windows. Я предполагаю, что также можно сделать эту работу с вкладками, но это требует дополнительных изменений в стилях окна целевого окна.

2.) Преобразование форм является односторонним. Я не смог найти способ реинтеграции форм обратно в главное окно доступа. Просто изменив код, он не работает.

0

Вы можете достичь этого без какого-либо кода API. Всего несколько простых настроек.

Используйте обычные формы, выключите вкладки и используйте интерфейс с вкладками.

Результат таков:

enter image description here

Вы можете добавить одну строку VBA при запуске, чтобы скрыть ленту, если вы хотите.

DoCmd.ShowToolbar "Ribbon", acToolbarNo 

Я очень рекомендую вышеуказанное, так как не требуется код API и т. Д. На самом деле требуется только одна строка кода. Если вам нужно запустить дополнительную форму, которая может быть перемещена за пределы пользовательского интерфейса, вы можете запустить всплывающее окно.