none
如何將外部程式加入FORM裡,並安全結束 RRS feed

  • 問題

  •  

    各位高手們好,我參考了http://tw.knowledge.yahoo.com/question/question?qid=1206050514148 WJS大大寫的程式,再加以修改為下列的程式.
    而修改的功能為,使用B_RUN鍵使記事本的test.txt檔案啓動,再利用B_STOP停止記事本test.txt的程序.
    而我修改後啓動可以,但是在用B_STOP停止時卻不可以,試了很久,還是找不出原因.不知是否有高手能教我一下,指出問題在那,因為實在對於api函數真的不熟,拜托,感謝
    而另一個問題是如何取出嵌入內部的test.txt視窗的left'RIGHT'HIGHT'WIDTH ,因為實際操作時,是另一個視窗(不是記事本),是可以設定視窗大小的,因此
    需要有能取得 被嵌入視窗的left'RIGHT'HIGHT'WIDTH ,來調整父視窗的left'RIGHT'HIGHT'WIDTH,才是比較保險的作法,因此也順便問高手們.

    當然如果可以,兩個問題一起回答是最好的,沒辨法的話,可以先我講第一個問題解答好嗎,感謝(而api函數的宣告我就不貼了,因為太長了,但是我實際程式都有宣告)

    Code Snippet

    Private Type PT

        X As Long

        Y As Long

    End Type

     

    Private Type RECT

        L As Long

        T As Long

        R As Long

        B As Long

    End Type

     

    Private Type Wn

        L As Long

        F As Long

        C As Long

        M As PT

        X As PT

        N As RECT

    End Type

     

        Dim V&

        Dim P&, R As RECT, W As Wn

     

        Function PTH(ByVal P&) As Long

            Dim A&, B&

            A = FindWindow(0, 0)

            Do While A

                If GetParent(A) = 0 Then

                    GetWindowThreadProcessId(A, B)

                    If B = P Then

                        PTH = A

                        Exit Do

                    End If

                End If

                A = GetWindow(A, 2)

            Loop

        End Function

     

        Private Sub b_run_Click()

            ChDir("c:\")

            P = Shell("C:\WINDOWS\system32\notepad.exe c:\test.txt")

            If P Then

                V = PTH(P)

                SetParent(V, Me.hwnd)

                Putfocus(V)

                ScaleMode = 3

                W.L = Len(W)

                R.T = ScaleTop - 100

                R.L = ScaleLeft - 10

                R.R = ScaleWidth

                R.B = ScaleHeight

                W.C = 1

                W.N = R

                SetWindowPlacement(V, W)

            End If

        End Sub

     

        Private Sub b_stop_Click()

            Dim j As Long

            j = PostMessage(V, ws_cancelmode, 0, 0)

            j = PostMessage(V, WM_CLOSE, 0, 0)

            j = TerminateProcess(V, 0)

        End Sub

     

     

    -----------------------------------------------------------------------------------------------

    編輯附註 by bauann:貼程式碼時請加以排版以利於網友觀看,謝謝。

    2008年6月16日 上午 06:01

解答

  • 1. 學號、座號、身分證字號有什麼差別?是一樣的嗎?名稱不同當然不一樣。

     

    2. 因為你用 VB ,VC 有提供檔頭可以引入。查 MSDN 函數說明最下方有:

    Code Snippet

     

    Minimum DLL Version user32.dll
    Header Declared in Winuser.h, include Windows.h
    Import library User32.lib
    Minimum operating systems Windows 95, Windows NT 3.1
    Unicode Implemented as Unicode version.

     

     

    在紅色標記這兩個檔找常數宣告。

    我英文也不好,英文不好不是藉口。我考大學、研究所英文都考 28 分,你比我爛嗎?

     

    3. MSDN 是基本的。

    我的參考書目:http://tlcheng.twbbs.org/TLCheng/WinAPI/winapi.asp?action=Referance

     

     

    2008年6月17日 上午 09:44
    版主

所有回覆

  • 獨立的兩程序本來就只能看起來像,而非真正的崁入。

     

    PostMessage 的第一引數是 hWnd ,TerminateProcess 的第一引數是 hProcess ,根本就不是同一個,你引數亂傳,怎能關閉?

     

    Shell 傳回的是 ProcessId ,所以你的 PTH 應該是要轉換成 hWnd ,可是不知道目地是啥,FindWindow 是 0,0 ,這要抓啥?還不如用 GetFocus 抓作用中的 hWnd ,但是這邊有時間差的問題,要等你新視窗開出來才有意義,要是前面還有個版權畫面就會有問題。

     

    用 OpenProcess 將 ProcessId 取得 hProcess ,用 GetGUIThreadInfo / GetWindow 取得最上層主要的 hWnd 。

     

    註:VBNET 已經包裝好 Process 類別可以用,若是你用 VBNET ,使用 Process.Kill / Process.MainWindowHandle 即可。

     

     

    2008年6月16日 上午 09:09
    版主
  • 真的很謝謝璉璉大大的回答,真的謝謝

    不過可以問璉璉大大一些問題嗎?因為之前完全沒有碰過API,所以可以完全不知API是如何動作的,所以想請問璉璉大大

    1,關於  hProcess, hWnd ,ProcessId  這三個變數有什麼差別呢?還有hprocess跟processid 是一樣的嗎?

    2,
        像EnableMenuItem(hMnu, SC_CLOSE, MF_DISABLED)      PostMessage(hwnd,WM_CLOSE, 0, 0)

    這些函數裡都有SC_CLOSE  WM_CLOSE, MF_DISABLED  這些用來設定的變數字串。而使用上似乎要設定

    這些字串的值,像MF_DISABLED = &H2&  MF_ENABLED = &H0&  WM_CLOSE = &H10,而這些值,可以隨便設定給它,還是有固定的值,怎樣的字串就要設怎樣的值才行,
    可以請大大跟我講一下好嗎。另外我有去微軟的 MSDN LIBARY 找這些字串變數,可是英文實在不好,每次SEARCH時,都會跑出一大串聯結,也不知要找那一個才對。
    如果可以的話,可以請大大告訴我,這些變數字串,該去那裡尋找嗎?

     

    3, 可以請大大跟我講你學api的方法嗎?因為用了好久,一直找不到學api的方法,或是找那幾本書比較好,可以請大大告訴我好嗎?我真的很需要,感謝。

     

    對了,璉璉大大真的很謝謝你的幫忙。

     

    2008年6月17日 上午 09:26
  • 1. 學號、座號、身分證字號有什麼差別?是一樣的嗎?名稱不同當然不一樣。

     

    2. 因為你用 VB ,VC 有提供檔頭可以引入。查 MSDN 函數說明最下方有:

    Code Snippet

     

    Minimum DLL Version user32.dll
    Header Declared in Winuser.h, include Windows.h
    Import library User32.lib
    Minimum operating systems Windows 95, Windows NT 3.1
    Unicode Implemented as Unicode version.

     

     

    在紅色標記這兩個檔找常數宣告。

    我英文也不好,英文不好不是藉口。我考大學、研究所英文都考 28 分,你比我爛嗎?

     

    3. MSDN 是基本的。

    我的參考書目:http://tlcheng.twbbs.org/TLCheng/WinAPI/winapi.asp?action=Referance

     

     

    2008年6月17日 上午 09:44
    版主