4

プロジェクトとしてクリップボードモニターを作成していますが、クリップボードの変更時に、アプリケーションはGetClipboardOwnerを呼び出して、どのプログラムがクリップボードを使用したかを検出します。

これはコードからの抜粋です:

protected override void WndProc(ref Message m)
        {
            const int WM_DRAWCLIPBOARD = 0x308;
            const int WM_CHANGECBCHAIN = 0x030D;

            switch (m.Msg)
            {
                case WM_DRAWCLIPBOARD:
                    Debug.Indent();
                    //Process the clipboard here
                    uint processId;
                    IntPtr ownerHwnd = GetClipboardOwner();
                    GetWindowThreadProcessId(ownerHwnd, out processId);
                    Process proc = Process.GetProcessById((int)processId);
                    Debug.WriteLine(String.Format("Window Title: {0} Filename: {1}", proc.MainWindowTitle, process.MainModule.FileName));
                    SendMessage(_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;

                case WM_CHANGECBCHAIN:
                    if (m.WParam == _NextClipboardViewer)
                        _NextClipboardViewer = m.LParam;
                    else
                        SendMessage(_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;

                default:
                    base.WndProc(ref m);
                    break;
            }
        }

およびDLLImports:

[DllImport("User32.dll")]
        public static extern IntPtr SetClipboardViewer(IntPtr _newviewerhandle);

[DllImport("User32.dll")]
        public static extern bool ChangeClipboardChain(IntPtr removehandle, IntPtr nexthandle);

[DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);

[DllImport("User32.dll")]
        public static extern IntPtr GetClipboardOwner();

[DllImport("kernel32.dll")]
        public static extern int GetWindowThreadProcessId(IntPtr handle, out uint threadid);

出力ウィンドウの例外は次のとおりです-Something.exeでタイプ「System.EntryPointNotFoundException」の最初のチャンスの例外が発生しました

UPDATE 2「Kernel32」を「User32」に変更すると機能しますが、Word、Excelなどの一部のアプリケーションでは、この例外が発生します。タイプ'System.ComponentModel.Win32Exception'の最初のチャンスの例外がSystem.dllで発生しました

何か案は ?

UPDATE 3上記の例外は、32ビットプロセス(私のアプリケーション)が64ビットプロセス(Word、Excelなど)のモジュールにアクセスしたために発生しました。構成をx64に変更すると機能しました。

4

1 に答える 1

6

DllImportforは、ではなく、をGetWindowThreadProcessId使用する必要がありますuser32.dllkernel32.dll

MSDNによる:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522 (v = vs.85).aspx

または、単にPInvoke.Netを使用します:GetWindowThreadProcessId

于 2012-06-03T03:35:05.860 に答える