문제

Python에 다른 프로그램에서 COM을 통해 창 핸들을 얻는 프로그램이 있습니다 (Python 프로그램을 Addin으로 생각하십시오) 나는이 창을 기본 Python Frame의 부모로 설정하여 다른 프로그램이 최소화되면 Python 프레임도 마찬가지입니다. . 문제는 출구로 가서 메인 프레임을 닫거나 파괴하려고 할 때 프레임이 실행을 완료하지 못하며 (사라 졌음에도 불구하고) 다른 프로그램은 TaskManager와 함께 죽이지 않으면 닫기를 거부합니다.

다음은 대략 우리가 취하는 단계입니다.

if we are started directly, launch other program
if not, we are called from the other program, do nothing

enter main function:
create new wx.App
set other program as frame parent:
  Get handle via COM
  create a parent using wx.Window_FromHWND
  create new frame with handle as parent
  show frame
enter main loop

App.onexit:
  close frame
  frame = None
  handle as parent = None
  handle = None

누구든지 이것에 대한 생각이나 이런 종류의 경험이 있습니까?

나는 이것에 대한 도움을 주셔서 감사합니다!

편집] 핸들을 부모로 사용할 때만이 경우에만 해당됩니다. 핸들을 얻고 파이썬 프로그램을 닫으면 다른 프로그램은 잘 닫힙니다.

도움이 되었습니까?

해결책 3

이것에 대한 나의 해결책은 약간 해킹되었으며, 내가 생각해 낸 가장 우아한 솔루션은 아니지만 다소 효과적으로 작동합니다 ...

기본적으로 내 단계는 윈도우 핸들이 존재하는지 여부를 확인하기 위해 폴링하는 스레드를 시작하는 것입니다. 여전히 존재하지만 아무것도하지 않습니다. 더 이상 존재하지 않으면 Python 응용 프로그램을 죽여 핸들 (및 기본 응용 프로그램)이 해제 될 수 있습니다.

class CheckingThread(threading.Thread):
    '''
    This class runs a check on Parent Window to see if it still is running
    If Parent Window closes, this class kills the Python Window application in memory
    '''
    def run(self):
        '''
        Checks Parent Window in 5 seconds intervals to make sure it is still alive.
        If not alive, exit application
        '''
        self.needKill = False

        while not self.needKill:
            if self.handle is not None:
                if not win32gui.IsWindow(self.handle):
                    os._exit(0)
                    break
            time.sleep(5)

    def Kill(self):
        '''
        Call from Python Window main application that causes application to exit
        '''
        self.needKill = True

    def SetHandle(self, handle):
        '''
        Sets Handle so thread can check if handle exists.
        This must be called before thread is started.
        '''
        self.handle = handle

다시 말하지만, 그것은 약간 해킹 된 느낌이지만, 나는 그 주위에 다른 방법을 실제로 보지 못합니다. 다른 사람이 더 나은 결의안이 있으면 게시하십시오.

다른 팁

당신이 궁금합니다 Close 전화가 가까운 핸들러에 매달려있을 수 있습니다. 당신은 전화를 시도 했습니까? Destroy 대신에? 그것이 도움이되지 않는다면, 유일한 해결책은 당신의 프레임을 "회복"하거나 "분리"하는 것처럼 보일 것입니다. wx, 그러나 아마도 당신은 그 하나의 작업을 위해 Win32 API로 떨어질 수 있습니다 ...?

기울기가 필요한 전부라면 시도해 볼 수 있습니다. frame.Reparent(None) ~ 전에 frame.Close()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top