2011-07-05 21 views
16

Ho un errore particolare in cui alcuni processi sembrano utilizzare occasionalmente gli Appunti quando la mia applicazione va a gestire le operazioni di copia & incolla. Ci sono alcuni tentativi di lavoro in giro, e ho una soluzione accettabile, ma vorrei individuare quale processo è se l'errore si ripresenta.Determinare quale processo sta bloccando gli Appunti

+0

Mentre sono d'accordo con il sentimento di questa domanda, cosa faresti esattamente con questa informazione? Anche se fosse possibile (e, non sono sicuro che lo sia), non c'è molto che potresti fare con la risposta. (Uccidi il processo? Non è una possibilità!) –

+1

@ mike Potresti mettere un messaggio per far sapere all'utente? Potrebbe essere un processo sotto il controllo diretto dell'utente. – mickeyf

+0

@mickeyf Anche se lo fai, cosa dovrei fare io, l'utente? _I_ non ha bloccato gli appunti, e non c'è niente che posso fare per sbloccarlo, a meno di chiudere qualsiasi programma lo blocchi (e, dato che sto cercando di completare il mio lavoro, puoi semplicemente dimenticarlo.) –

risposta

18

ho avvolto la mia soluzione in un metodo facile da usare (e alcune dichiarazioni):

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr GetOpenClipboardWindow(); 

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

private static Process GetProcessLockingClipboard() 
{ 
    int processId; 
    GetWindowThreadProcessId(GetOpenClipboardWindow(), out processId); 

    return Process.GetProcessById(processId); 
} 

Godetevi !

+2

C'è un modo per bloccare consapevolmente gli appunti per vedere come tutto questo funziona? – toong

0

Per diagnosticare qualcosa come questo vorrei suggerire di iniziare con Process Explorer, http://technet.microsoft.com/en-us/sysinternals/bb896653

+0

Grazie, ma né io né gli utenti abbiamo il tempo di monitorare qualcosa del genere. Ad ogni modo, ho trovato quello che stavo cercando. –

+0

@RichardPianka: Se hai trovato quello che stavi cercando, condividilo qui. SO è una strada a doppio senso. –

3

Ecco una soluzione simile, ma questo ti dà una stringa è possibile mostrare l'utente:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern IntPtr GetOpenClipboardWindow(); 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern int GetWindowText(int hwnd, StringBuilder text, int count); 

private string getOpenClipboardWindowText() 
{ 
    IntPtr hwnd = GetOpenClipboardWindow(); 
    StringBuilder sb = new StringBuilder(501); 
    GetWindowText(hwnd.ToInt32(), sb, 500); 
    return sb.ToString(); 
} 
+0

Grazie, stavo cercando il nome del processo, ma questo è potenzialmente più utile per gli utenti finali. –

4

in base alla risposta di Jeff Roe, ma mostra come ottenere la lunghezza del testo, così potrebbe essere> 500. Anche gestisce il caso in cui la finestra non viene trovata.

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern IntPtr GetOpenClipboardWindow(); 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern int GetWindowText(int hwnd, StringBuilder text, int count); 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern int GetWindowTextLength(int hwnd); 

private static string GetOpenClipboardWindowText() 
{ 
    var hwnd = GetOpenClipboardWindow(); 
    if (hwnd == IntPtr.Zero) 
    { 
     return "Unknown"; 
    } 
    var int32Handle = hwnd.ToInt32(); 
    var len = GetWindowTextLength(int32Handle); 
    var sb = new StringBuilder(len); 
    GetWindowText(int32Handle, sb, len); 
    return sb.ToString(); 
} 
Problemi correlati