Я создаю монитор буфера обмена как проект, а при изменении буфера обмена приложение обнаруживает, какая программа использовала буфер обмена, вызывая 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 работал.
+1. Чтобы сэкономить проблемы, PInvoke.net - это место, где можно получить DllImports ... –
@AlexeiLevenkov Хороший звонок. Я забыл об этом сайте :) – jglouie
Вау! Благодарю. Теперь я чувствую себя глупо и смущен. Теперь я получаю еще одну ошибку ... обновляю вопрос – vs2010noob