2012-06-03 4 views
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); 

Исключение в окне вывода это - первый шанс исключение типа «System.EntryPointNotFoundException» произошло что-то .exe

UPDATE 2 После изменения «Kernel32» на «User32» он работает, но для некоторых приложений такие как Word, Excel, я получаю это исключение; Первое случайное исключение типа «System.ComponentModel.Win32Exception» произошло в System.dll

Любые идеи?

ОБНОВЛЕНИЕ 3 выше исключение было вызвано из 32-битного процесса (мое приложение) в доступе модуля 64-разрядный процесс (Word, Excel и т.д.) Изменения конфигурации на x64 работал.

ответ

6

DllImport для GetWindowThreadProcessId должны использовать user32.dll, не kernel32.dll

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

Или просто использовать Pinvoke.net: GetWindowThreadProcessId

+1

+1. Чтобы сэкономить проблемы, PInvoke.net - это место, где можно получить DllImports ... –

+0

@AlexeiLevenkov Хороший звонок. Я забыл об этом сайте :) – jglouie

+0

Вау! Благодарю. Теперь я чувствую себя глупо и смущен. Теперь я получаю еще одну ошибку ... обновляю вопрос – vs2010noob

Смежные вопросы