۱۳۸۸/۰۲/۲۰

بدست آوردن نام پروسه‌اي كه Clipboard را قفل كرده است


امروز Clipboard‌ سيستم عمل نمي‌كرد و عمليات حياتي copy/paste از كار افتاده بود! پس از كمي جستجو مشخص شد كه به صورت زير مي‌توان نام پروسه‌اي كه Clipboard را باز و قفل كرده و مانع عملكرد ساير برنامه‌ها مي‌شود، بدست آورد:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;

namespace testWinForms87
{
class CTestClipboard
{
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetOpenClipboardWindow();

[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(
IntPtr hWnd,
out uint lpdwProcessId);

public static void TrySetData()
{
try
{
Clipboard.SetData(DataFormats.Text, "وحيد");
}
catch
{
IntPtr hwnd = GetOpenClipboardWindow();
if (hwnd == IntPtr.Zero) return;
uint pid;
GetWindowThreadProcessId(hwnd, out pid);
MessageBox.Show(string.Format("clipboard is locked by: {0}",
Process.GetProcessById((int)pid).Modules[0].FileName));
}
}
}
}
با استفاده از تابع GetOpenClipboardWindow دستگيره پنجره‌اي كه اين‌كار را كرده يافت مي‌شود و سپس با استفاده از GetWindowThreadProcessId مي‌توان id آن پروسه را يافت. سپس با كمك متد Process.GetProcessById امكان بدست آوردن اطلاعات بيشتري از آن پروسه ميسر مي‌گردد.



به نظر اين يك باگ در VPC است.
اگر از MS Virtual PC استفاده مي‌كنيد و اين اتفاق رخ داد، داخل سيستم عاملي كه توسط VPC در حال اجرا است، يك متن ساده را كپي كنيد. سپس به منوي برنامه VPC ، گزينه edit مراجعه كرده و در ادامه گزينه Paste را انتخاب كنيد. به اين صورت بدون نياز به بستن برنامه يا هر عمليات ديگري مشكل برطرف مي‌شود.