- 2013-6-18
- Visual C++
クリップボードを使用したプロセスを調べたりするプログラム。
例えば、ユーザにコピペさせないようにしたり出来るかも。
仕組みは意外に簡単。
SetClipboardViewer(); を実行して、WM_DRAWCLIPBOARD メッセージ
を拾うだけ。
取り合えず、msdn参照のこと。
ここからサンプル。
色々端折ってるから、自己責任で。
ちなみに、コピペだけだとコンパイル通らないので注意。
// 監視実行 void CClipStopDlg::OnBnClickedButton1() { // クリップボードチェインへウインドウを追加 m_hWnd = SetClipboardViewer(); } void CClipStopDlg::OnDrawClipboard() { CDialog::OnDrawClipboard(); HWND hWnd = NULL; DWORD dwProcId = 0; DWORD dwThId = 0; HANDLE hProcess = NULL; CWnd *pWnd = NULL; HMODULE hModule = NULL; DWORD cbNeeded = 0; CHAR lpFilePath[ _MAX_PATH ] = { NULL }; CString strWinTxt; pWnd = GetClipboardOwner( ); // クリップボード所有者でウインドウが無い場合 if( pWnd == NULL ) { return; } // プロセスIDを取得する dwThId = GetWindowThreadProcessId( pWnd->m_hWnd, &dwProcId ); strWinTxt.Format( "プロセスID:%d\n", dwProcId ); OutputDebugString( strWinTxt ); // 該当プロセスをオープン hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcId ); if( hProcess == NULL ) { MessageBoxA( "OpenProcess 失敗" ); return; } if( EnumProcessModules( hProcess, &hModule, sizeof( hModule ), &cbNeeded ) == FALSE ) { MessageBoxA( "EnumProcessModules 失敗" ); return; } GetModuleFileNameEx( hProcess, hModule, lpFilePath, _MAX_PATH ); strWinTxt.Format( "プロセス名:%s\n", lpFilePath, ); // プロセス名をデバックウインドウに表示(出力) OutputDebugString( strWinTxt ) }
んな感じ。