これに遭遇したので、ソリューションを追加すると思いました。レコードをデータベースに貼り付けるボタンがあるので、クライアントにとっては明らかです。クリップボードに有効なデータがある場合にのみボタンを有効にしたかったのです。これは次のようになります。
レコードが選択された、背面の My App と前面の notepad++。Notepad++ のテキストを「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;
}
私のアプリのメインスレッドはメッセージによって起動され、「私」はアプリをアクティブウィンドウにせずにオンとオフを切り替えます。そして、それは追加のコードなしで起こります。