当我遇到这个问题时,我想我会添加我的解决方案。我有一个按钮可以将记录粘贴到数据库中,因此客户端很清楚,我只希望在剪贴板上有有效数据时启用该按钮。这是它的样子:

后面是我的应用程序,前面是记事本++,并选择了记录。当我'ctrl C' 记事本++ 中的文本时,即使我的应用程序处于空闲状态,我的工具栏上的'I' 也会变为活动状态。我的应用程序是剪贴板链的一部分并得到通知。这是 WM_DRAWCLIPBOARD 处理程序。
LRESULT CMainFrame::OnDrawClipboard( WPARAM wparam, LPARAM lparam )
{
if( hWndClipboardChain )
::SendMessage( hWndClipboardChain, WM_DRAWCLIPBOARD, wparam, lparam );
if( wparam )
PostMessage( ID_CLIPBOARD_HASCHANGED, 0, 0 );
return TRUE;
}
从那里我发布到我的应用程序不会妨碍 WM_DRAWCLIPBOARD 消息,并且那里:
LRESULT CMainFrame::OnCheckClipboard( WPARAM wparam, LPARAM lparam )
{
std::string data( GetClipboardStr( ) );
std::string::size_type end_cnt= data.find( "\r\n" );
if( end_cnt == std::string::npos )
bClipboardHasValidRecords= false;
else
{
auto header_end= data.begin( ) + end_cnt;
csv_vect_t header;
split( header, str_it_range_t( data.begin( ), header_end ), boost::is_any_of("\t") );
bClipboardHasValidRecords= header.size( ) == RARECORD_SIZE;
}
return TRUE;
}
我的应用程序的主线程被消息唤醒,“我”将在不使应用程序成为活动窗口的情况下打开和关闭。它只是在没有任何额外代码的情况下发生。