2013-06-02 5 views
5

Access 창을 숨기고 바탕 화면에 양식을 표시 할 수 있도록 기본 Access 창에서 '탈출'을 위해 Microsoft Access를 얻으려고했습니다. 다른 응용 프로그램과 함께 쉽게 배치 할 수 있습니다.SetParent를 사용하여 액세스 양식에서 액세스 탈출

처음에는 Access의 자체 Form.PopUp 속성을 사용하는 코드 샘플을 발견했지만 런타임시 디자인 뷰에서만 설정할 수 없습니다. 이것이 내가 할 노력하고있어 달성하기 위해 보이지만, 두 가지 단점이 있습니다 : 디자인보기와 일반보기 사이를 전환

  1. '폐쇄'사이에 창을 필요로 - 차라리 유지하기가 뜨고 것 현재 저장되지 않은 새 레코드를 만드는 데 사용되는 것과 같은 현재 상태입니다.

  2. 주 양식에서 다른 양식을 열려고하는데이 양식도 '팝업'으로 설정하지 않으면이 방법으로 제대로 작동하지 않는 것으로 보입니다. 그러나 이것은 두 가지 팝업 창 사이를 쉽게 전환 할 수 있는지 여부를 확신 할 수없는 디자인보기 등으로 삽입해야하는 번거 로움입니다.

그런 다음 SetParent라는 API 함수가 필요한 것으로 보입니다. 나는 그것으로 입력 할 수 있습니다 (

  1. 창은 오히려 응답하지 않는 것 같았다 : 나는 다음과 같은 명령 (VBA 구문) 사용 :

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

    을하지만 두 가지 문제 (아마 관련에 달렸다 .

    BugCheck 1000008E, {c0000005, 9e3573f5, 88d9da10, 0} 
    Probably caused by : win32k.sys (win32k!xxxNextWindow+3a6) 
    at win32k!EngLineTo+1a641 
    
  2. : 예를 들어 및 버튼을 클릭하면) 중 하나가 작동하는 것 같지 않았어요

  3. 을 내가 ALT + TAB을했을 때, 나는 BSOD있어

기본 액세스 창 외부에서 다른 액세스 양식을 호출하고 표시 할 수있는 액세스 창없이 양식을 만들 수있는 다른 방법이 있습니까?

SetParent API Documentation 나는 UI 상태를 변경하고 창 스타일을 변경했지만 수행 할 수있는 몇 가지 다른 작업이 있음을 알고 있었지만 올바른 방법을 찾을 수 없습니다. 이게 BSOD 및 응답하지 않는 문제를 해결할 수 있습니까?

아이디어를 제공해 주셔서 감사합니다.

+0

@JanW : 귀하의 문제가이 질문과 관련이 있는지 여부는 잘 모르겠습니다 (단일 양식과 디자인보기를 사용할 수 있음). 참고 : 대부분의 Access UI 요소를 제거하는 방법은 http://stackoverflow.com/a/24638829/3820271을 참조하십시오. – Andre

+0

@JanW : 내 대답은 원래 질문을 해결합니다. 이것이 당신의 목표를 달성하는 데 도움이 될지 모르겠습니다. 그렇지 않다면 요구 사항을 구체적으로 다루는 새로운 질문을 던지시기 바랍니다. 질문에 대한 질문과 다소 다릅니다. – PhilS

답변

0

나는 C#에서 기본적으로 탭 패널을 가지고 있는데, 여기에는 내 MS Access 창을 넣을 수 있지만 버튼을 클릭 할 수는 있지만 여전히 텍스트 상자에 입력하는 중입니다. 나는 체크 박스를 체크하고 문제없이 다른 것들을 할 수있다 ..

어쨌든, 나에게 당신의 이메일이나 어떤 식 으로든 내가 당신과 연락 할 수 있다면, 우리는 이것을 함께 해결할 수있다. 2 명은 알아낼 수있는 더 좋은 기회를 가지고있다. 지금은 다음과 같습니다.

 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

이것은 답변이 아니라 동일한 질문을 한 다른 사람의 게시물입니다. 난 새로운 사용자가 코멘트를 쓰는 스택 오버플로의 한계로 인해 답변으로 추가 된 것으로 가정합니다. @ 릭 나는이 문제를 몇 달 동안 보지 않았다. 나는 결국 Windows API를 실제로 알지 못하므로 내 질문의 옵션 1을 고수하기로 결정했다. 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 

이 코드는 Access 양식을 Access 주 창 외부로 이동할 수있는 PopUp 형식으로 변환합니다. 폼의 부모 창을 바탕 화면 창으로 설정하고 WS_CHILD 창 스타일을 제거하고 대신 WS_POPUP 스타일을 추가합니다.

코드는 언제든지 호출 할 수 있으며 특정 디자인 타임 설정이 필요하지 않습니다. 어떤 폼에서든 코드를 호출하려면 MakePopupWindow 메서드를 호출하고 대상 폼의 hWnd를 호출하면됩니다.

현재의 구현은 몇 가지 제한 사항이 있습니다 :

1.) 현재 데이터베이스의 문서 창 옵션은 중복 윈도우로 설정해야합니다. Tabbed Documents에서도이 작업을 수행 할 수 있어야하지만 대상 창에 대한 창 스타일을 추가로 변경해야합니다.

2.) 양식 변환은 단방향입니다. 양식을 다시 Access 기본 창으로 다시 통합 할 수있는 방법을 찾지 못했습니다. 코드를 뒤집어서 작동하지 않았습니다.

0

API 코드없이이 작업을 수행 할 수 있습니다. 몇 가지 간단한 설정.

일반 양식을 사용하고 탭을 끄고 탭 인터페이스를 사용하십시오.

결과는 이것이다 : 당신은 당신이 원하는 경우 리본을 숨길 시작할 때 VBA의 한 줄을 추가 할 수 있습니다

enter image description here

.

DoCmd.ShowToolbar "Ribbon", acToolbarNo 

API 코드 등이 필요하지 않으므로 상기 사항을 적극 권장합니다. 사실 한 줄의 코드 만 필요합니다. UI 외부로 이동할 수있는 추가 양식을 시작해야하는 경우 팝업 양식을 시작할 수 있습니다.