Как найти название открытого в настоящий момент документа MS Office? - PullRequest
1 голос
/ 06 февраля 2010

Я хочу найти название офисного документа (например, exel, word, access ... и т. Д.), Который в настоящее время открыт в моей операционной системе. Все это делается через мой код C #.

Если у кого-то есть идеи по этому поводу, пожалуйста, поделитесь.

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

UPDATE: У меня есть одно настольное приложение, разработанное на C # .net. я хочу сделать что-то с моим приложением, чтобы при установке этого приложения на клиентскую систему и при открытии клиентом любого офисного документа в его системе он записывался в фоновом режиме в моей базе данных, т.е. когда он открывает определенный файл, когда он закрывается и сколько сколько времени он тратит на этот файл и сколько времени этот файл открывается в режиме ожидания (без работы) с именем этого файла. Это мое требование.

Ответы [ 2 ]

0 голосов
/ 20 августа 2010

Адаптировано следующее: http://pinvoke.net/default.aspx/user32.EnumDesktopWindows

Вы захотите изменить критерии фильтра EnumWindowsProc в соответствии с вашими потребностями.Код просматривает заголовок окна, но если вам нужен путь к файлу, вы можете использовать hWnd, чтобы найти его.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;

namespace ConsoleApplication5
{
    class Program
    {
    const int MAXTITLE = 255;

    private static ArrayList mTitlesList;

    private delegate bool EnumDelegate(IntPtr hWnd, int lParam);

    [DllImport("user32.dll", EntryPoint="EnumDesktopWindows", ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
    private static extern bool _EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);

    [DllImport("user32.dll", EntryPoint="GetWindowText", ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
    private static extern int _GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

    [DllImport("user32.dll", EntryPoint = "GetWindowModuleFileName", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int _GetWindowModuleFileName(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

    private static bool EnumWindowsProc(IntPtr hWnd, int lParam)
    {
        string title = GetWindowText(hWnd);

        if (title.Contains("Microsoft Word")   || 
            title.Contains("Microsoft Access") || 
            title.Contains("Microsoft Excel")  ||
            title.Contains("Microsoft Outlook") ||
            title.Contains("Microsoft PowerPoint"))
        {
            mTitlesList.Add(title);
        }

        return true;
    }

    public static string GetWindowText(IntPtr hWnd)
    {
        StringBuilder title = new StringBuilder(MAXTITLE);
        int titleLength = _GetWindowText(hWnd, title, title.Capacity + 1);
        title.Length = titleLength;

        return title.ToString();
    }

    public static string[] GetDesktopWindowsCaptions()
    {
        mTitlesList = new ArrayList();
        EnumDelegate enumfunc = new EnumDelegate(EnumWindowsProc);
        IntPtr hDesktop = IntPtr.Zero; // current desktop
        bool success = _EnumDesktopWindows(hDesktop, enumfunc, IntPtr.Zero);

        if (success)
        {
            string[] titles = new string[mTitlesList.Count];
            mTitlesList.CopyTo(titles);
            return titles;
        }
        else
        {
            int errorCode = Marshal.GetLastWin32Error();
            string errorMessage = String.Format("EnumDesktopWindows failed with code {0}.", errorCode);
            throw new Exception(errorMessage);
        }
    }

    static void Main()
    {
        string[] desktopWindowsCaptions = GetDesktopWindowsCaptions();
        foreach (string caption in desktopWindowsCaptions)
        {
            Console.WriteLine(caption);
        }
    }
}
}
0 голосов
/ 06 февраля 2010

Приложение, которое вы описываете, звучит как пребывание в противоречии с безопасностью системы. Схема на самом деле похожа на вредоносное ПО , работающее в фоновом режиме и перехватывающее взаимодействия различных пользователей, молча, без ведома пользователя и т. Д.

В любом случае, возвращаясь к техническому решению, возможно, вы выясните что-то на основе проверки дорожек, которые MS Office оставляет в реестре при открытии / закрытии документа.

MS Office хранит список MRU в реестре (см. Как очистить список «Список последних использовавшихся» (MRU) в программах Office и соответствующие статьи для получения сведений о ключах реестра).

Таким образом, вы можете периодически сканировать определенные ключи реестра, то есть раз в минуту, а затем проводить сравнения (предыдущее или текущее состояние MRU), вычислять некоторую статистику и т. Д. Однако это не идеально.

...