전 세계 다중 값 클립 보드를 만들려고합니다. 스택을 사용하여 값을 저장했습니다. WinProc()
을 사용하여 스택의 값을 밀어 넣는 전역 복사 작업을 캡처합니다. 마찬가지로 Ctrl-V (붙여 넣기) 작업을 캡처하기 위해 Windows 키보드 후크를 사용하고 있습니다. 두 함수의 코드는 다음과 같습니다. 코드를 복사하여 this에서 수정했습니다.클립 보드 업데이트 이벤트가 여러 번 발생했습니다.
private int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
var hookStruct = (KbLLHookStruct)Marshal.PtrToStructure(lParam, typeof(KbLLHookStruct));
// Quick and dirty check. You may need to check if this is correct. See GetKeyState for more info.
bool ctrlDown = GetKeyState(VK_LCONTROL) != 0 || GetKeyState(VK_RCONTROL) != 0;
if (ctrlDown && hookStruct.vkCode == 0x56) // Ctrl+V
{
if (clipBoardStack.Count > 0)
{
lock (this)
{
localChange = true;
RemoveClipboardFormatListener(this.Handle); // Remove our window from the clipboard's format listener list.
System.Threading.Thread.Sleep(200);
Clipboard.SetText(clipBoardStack.Pop());
AddClipboardFormatListener(this.Handle);
System.Threading.Thread.Sleep(200);
}
}
}
}
// Pass to other keyboard handlers. Makes the Ctrl+V pass through.
return CallNextHookEx(_hookHandle, nCode, wParam, lParam);
}
내 WinProc 재정의는 다음과 같습니다. 나는 그것을뿐만 아니라에서 복사했지만 링크를 기억하지 않습니다.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_CLIPBOARDUPDATE)
{
if (!localChange)//Only store the data in stack when it comes from outside. Just to prevent the side effect of Paste Operation
{
IDataObject iData = Clipboard.GetDataObject(); // Clipboard's data.
if (iData.GetDataPresent(DataFormats.Text))
{
lock (this)
{
string text = (string)iData.GetData(DataFormats.Text);
clipBoardStack.Push(text);
}
}
}
else
{
localChange = false;
}
}
복사 작업이 원활하게 작동합니다. 스택을 채 웁니다. 그러나 붙여 넣기 작업을 사용하면 WM_CLIPBOARDUPDATE 이벤트가 트리거됩니다. 그러면 가장 최근 값으로 스택이 다시 채워집니다.
붙여 넣기 절에서 클립 보드 값을 변경하면 WM_CLIPBOARDUPDATE 이벤트가 트리거됩니다. 목록 수신기 등록을 시도했지만 플래그 변수 'localChange'를 사용하려고 시도했지만 블록을 사용하려고했습니다 (),하지만 아무것도 작동하지 않습니다.
해결 방법은 무엇입니까?