- 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 )
}
んな感じ。






