WinAPI如何检测复制发生在哪个控件中

WinAPI如何检测复制发生在哪个控件中,winapi,copy,Winapi,Copy,我想知道如何在我的win32应用程序中识别复制发生在哪个控件中。 例如在EditBox、RichEdit等中 为了确定复制是在我的应用程序内还是在应用程序外进行,我使用了以下方法: //global variables HWND hWnd; DWORD ProcId; HWND nextHandle; DWORD currentID; //then I call two functions on form create currentID=GetCurrentProcessId();

我想知道如何在我的win32应用程序中识别复制发生在哪个控件中。 例如在EditBox、RichEdit等中

为了确定复制是在我的应用程序内还是在应用程序外进行,我使用了以下方法:

//global variables

HWND hWnd; 
DWORD ProcId; 
HWND nextHandle; 
DWORD currentID;

//then I call two functions on form create

currentID=GetCurrentProcessId();
nextHandle = SetClipboardViewer(Handle); 

//then on  WM_DRAWCLIPBOARD message I call 

hWnd = GetClipboardOwner();
GetWindowThreadProcessId(hWnd,&ProcId);

// functions and checking by IDs whether
// the copying took place in or outside my application 

if(lpdwProcessId==currentID) {...}

它工作正常,但这不是一个解决方案,如何在whitch控件(在我的应用程序中)检测复制发生。

嗯,我想你可以使用。这不是100%可靠。剪贴板可以包含数据,并且此函数可以返回
NULL
。首先,剪贴板可以由控件以外的其他对象填充,但我希望有很多方法可以让剪贴板充满数据,并且没有所有者窗口。但只要你的应用程序不会对剪贴板做太不标准的事情,我认为它会为你做这项工作


如果您想100%确定应用程序中的哪个控件在剪贴板中填充了数据,请跟踪上次填充剪贴板的控件。

您问了这个问题,但此后一直保持沉默。你还需要帮助吗?在
WM_DRAWCLIPBOARD
上,调用
GetFocus
以找出哪个控件具有输入焦点。谢谢你,乔纳森,我会试试。当我在RichEdit控件中按CTRL+C时,GetFocus()函数显示它具有焦点,但不幸的是GetClipboardOwner()函数不适用于它,不像编辑控件。大卫,谢谢你的评论。在使用函数GetClipboardOwner()之后,我注意到,当从RichEdit控件填充剪贴板时,它总是返回零(NULL),这与编辑控件不同。在这种情况下,您只需跟踪最后填充剪贴板的窗口。我可以用丰富的编辑控件复制您描述的内容。我想你运气不好。您必须保持跟踪。不幸的是,很难得到通知,要求富编辑控件复制到剪贴板。如果按CTRL+C,则不会发送任何
WM\u COPY
消息。谢谢David。我还不知道如何解决这个问题。我必须考虑一下。