프로세스 핸들을 사용하여 MS-Word 응용 프로그램 인스턴스 가져 오기

아니 켓 반 살리

이것을 사용하여

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern IntPtr GetForegroundWindow();

그런 다음 프로세스에 대한 핸들을 검색합니다.

IntPtr hwnd = GetForegroundWindow();
int pid = APIFuncs.GetWindowProcessID(hwnd);
Process p = Process.GetProcessById(pid);
string appName = p.ProcessName;

따라서 appName = "WINWORD"를 찾을 때마다 hwnd를 사용하여 Word 응용 프로그램 개체를 검색하고 싶습니다.

참고 : 단어의 새 인스턴스를 만들고 싶지 않고 하나만 실행하면됩니다.

더크 볼마

창 핸들이 주어지면 AccessibleObjectFromWindowoleacc.dll 함수를 사용하여 자동화 가능한 Word 응용 프로그램 인스턴스를 얻습니다.

다음은 사용 방법을 보여주는 샘플 프로그램입니다 (Microsoft.Office.Interop.Word.dll에 대한 참조 추가).

using Microsoft.Office.Interop.Word;
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;

namespace WordLateBindingSample
{
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00020400-0000-0000-C000-000000000046")]
    public interface IDispatch
    {
    }

    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("Oleacc.dll")]
        static extern int AccessibleObjectFromWindow(int hwnd, uint dwObjectID, byte[] riid, out IDispatch ptr);

        public delegate bool EnumChildCallback(int hwnd, ref int lParam);

        [DllImport("User32.dll")]
        public static extern bool EnumChildWindows(int hWndParent, EnumChildCallback lpEnumFunc, ref int lParam);

        [DllImport("User32.dll")]
        public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);

        public static bool EnumChildProc(int hwndChild, ref int lParam)
        {
            StringBuilder buf = new StringBuilder(128);
            GetClassName(hwndChild, buf, 128);
            if (buf.ToString() == "_WwG")
            {
                lParam = hwndChild;
                return false;
            }
            return true;
        }

        static void Main(string[] args)
        {
            // Use the window class name ("OpusApp") to retrieve a handle to Word's main window.
            // Alternatively you can get the window handle via the process id:
            // int hwnd = (int)Process.GetProcessById(wordPid).MainWindowHandle;
            //
            int hwnd = (int)FindWindow("OpusApp", null);

            if (hwnd != 0)
            {
                int hwndChild = 0;

                // Search the accessible child window (it has class name "_WwG") 
                // as described in http://msdn.microsoft.com/en-us/library/dd317978%28VS.85%29.aspx
                //
                EnumChildCallback cb = new EnumChildCallback(EnumChildProc);
                EnumChildWindows(hwnd, cb, ref hwndChild);

                if (hwndChild != 0)
                {
                    // We call AccessibleObjectFromWindow, passing the constant OBJID_NATIVEOM (defined in winuser.h) 
                    // and IID_IDispatch - we want an IDispatch pointer into the native object model.
                    //
                    const uint OBJID_NATIVEOM = 0xFFFFFFF0;
                    Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
                    IDispatch ptr;

                    int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr);

                    if (hr >= 0)
                    {
                        var wordApp = (Application)ptr.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, ptr, null);

                        var version = wordApp.Version;
                        Console.WriteLine(string.Format("Word version is: {0}", version));
                    }
                }
            }
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

프로세스가 내 응용 프로그램을 중단

분류에서Dev

"시드"기반 수학을 사용하여 응용 프로그램 인스턴스 재생성

분류에서Dev

Linux에서 응용 프로그램의 (Windows 유형) 인스턴스 만들기

분류에서Dev

VBscript를 사용하여 응용 프로그램 창에서 텍스트 읽기 / 가져 오기

분류에서Dev

응용 프로그램이 MSAL (react-aad-msal)을 사용하여 캐시에서 액세스 토큰을 가져 오지 않습니다.

분류에서Dev

C ++ 프로세스 이름을 사용하여 Windows 제목 가져 오기

분류에서Dev

C #을 사용하여 다른 응용 프로그램의 텍스트 상자에 입력 된 텍스트 가져 오기

분류에서Dev

Office 응용 프로그램의 기존 인스턴스 찾기

분류에서Dev

netlink를 사용하여 프로세스 inode 가져 오기

분류에서Dev

플라스크 응용 프로그램의 가져 오기 오류

분류에서Dev

웹 서비스를 사용하여 phonegap 응용 프로그램 만들기

분류에서Dev

DNS, Heroku 스타일을 사용하여 deis 응용 프로그램 숨기기

분류에서Dev

MS Access 응용 프로그램 오프라인으로 작업

분류에서Dev

sidekiq은 프로세스를 초기화하기 위해 종속 응용 프로그램을 사용합니까?

분류에서Dev

Gnome-한 응용 프로그램의 인스턴스를 전환하는 바로 가기

분류에서Dev

창을 선택하지 않고 응용 프로그램 인스턴스로 전환하는 전역 바로 가기

분류에서Dev

WinXP에서 배치 스크립트를 사용하여 응용 프로그램을 맨 앞으로 가져 오는 방법

분류에서Dev

면도기 응용 프로그램을 사용하여보기에서 특수 프랑스어 문자 사용

분류에서Dev

응용 프로그램 풀을 통해 프로세스 격리

분류에서Dev

Word 응용 프로그램을 열 때 "문서가 사용됨"

분류에서Dev

JUnit을 사용하여 JavaFX 응용 프로그램 테스트

분류에서Dev

응용 프로그램 개체를 인스턴스화하고 목록을 초기화합니다.

분류에서Dev

Mac에서 여러 응용 프로그램 인스턴스 열기

분류에서Dev

응용 프로그램 전체에서 액세스 할 수있는 사용자 프로필 만들기

분류에서Dev

ServiceHost의 두 인스턴스가 하나의 응용 프로그램에있을 수 있습니까?

분류에서Dev

Ember / Handlebars : 핸들 바 도우미 함수에서 응용 프로그램 컨트롤러 가져 오기

분류에서Dev

제네릭을 사용하여 클래스의 인스턴스 가져 오기

분류에서Dev

로컬 및 인스턴스 변수를 사용하여 프로그램의 응용 프로그램 디자인을 개선하는 방법

분류에서Dev

Django Rest Framework : ModelViewSet을 사용하여 PK별로 인스턴스 목록 가져 오기

Related 관련 기사

  1. 1

    프로세스가 내 응용 프로그램을 중단

  2. 2

    "시드"기반 수학을 사용하여 응용 프로그램 인스턴스 재생성

  3. 3

    Linux에서 응용 프로그램의 (Windows 유형) 인스턴스 만들기

  4. 4

    VBscript를 사용하여 응용 프로그램 창에서 텍스트 읽기 / 가져 오기

  5. 5

    응용 프로그램이 MSAL (react-aad-msal)을 사용하여 캐시에서 액세스 토큰을 가져 오지 않습니다.

  6. 6

    C ++ 프로세스 이름을 사용하여 Windows 제목 가져 오기

  7. 7

    C #을 사용하여 다른 응용 프로그램의 텍스트 상자에 입력 된 텍스트 가져 오기

  8. 8

    Office 응용 프로그램의 기존 인스턴스 찾기

  9. 9

    netlink를 사용하여 프로세스 inode 가져 오기

  10. 10

    플라스크 응용 프로그램의 가져 오기 오류

  11. 11

    웹 서비스를 사용하여 phonegap 응용 프로그램 만들기

  12. 12

    DNS, Heroku 스타일을 사용하여 deis 응용 프로그램 숨기기

  13. 13

    MS Access 응용 프로그램 오프라인으로 작업

  14. 14

    sidekiq은 프로세스를 초기화하기 위해 종속 응용 프로그램을 사용합니까?

  15. 15

    Gnome-한 응용 프로그램의 인스턴스를 전환하는 바로 가기

  16. 16

    창을 선택하지 않고 응용 프로그램 인스턴스로 전환하는 전역 바로 가기

  17. 17

    WinXP에서 배치 스크립트를 사용하여 응용 프로그램을 맨 앞으로 가져 오는 방법

  18. 18

    면도기 응용 프로그램을 사용하여보기에서 특수 프랑스어 문자 사용

  19. 19

    응용 프로그램 풀을 통해 프로세스 격리

  20. 20

    Word 응용 프로그램을 열 때 "문서가 사용됨"

  21. 21

    JUnit을 사용하여 JavaFX 응용 프로그램 테스트

  22. 22

    응용 프로그램 개체를 인스턴스화하고 목록을 초기화합니다.

  23. 23

    Mac에서 여러 응용 프로그램 인스턴스 열기

  24. 24

    응용 프로그램 전체에서 액세스 할 수있는 사용자 프로필 만들기

  25. 25

    ServiceHost의 두 인스턴스가 하나의 응용 프로그램에있을 수 있습니까?

  26. 26

    Ember / Handlebars : 핸들 바 도우미 함수에서 응용 프로그램 컨트롤러 가져 오기

  27. 27

    제네릭을 사용하여 클래스의 인스턴스 가져 오기

  28. 28

    로컬 및 인스턴스 변수를 사용하여 프로그램의 응용 프로그램 디자인을 개선하는 방법

  29. 29

    Django Rest Framework : ModelViewSet을 사용하여 PK별로 인스턴스 목록 가져 오기

뜨겁다태그

보관