惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
D
Docker
Vercel News
Vercel News
IT之家
IT之家
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
腾讯CDC
Google DeepMind News
Google DeepMind News
I
InfoQ
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
博客园 - Franky
The Cloudflare Blog
A
About on SuperTechFans
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
T
Tenable Blog
P
Proofpoint News Feed
Recorded Future
Recorded Future
Security Latest
Security Latest
H
Hackread – Cybersecurity News, Data Breaches, AI and More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 聂微东
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google Online Security Blog
Google Online Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
U
Unit 42
The Hacker News
The Hacker News
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
F
Full Disclosure
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
V
V2EX
Project Zero
Project Zero

博客园 - 秋雨飘飞

Data type mismatch in criteria expression. 条件表达式中数据类型不匹配 PInvoke 知识记录 近两年的BLOG博龄 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教 ACCESS模糊查询出现的变态问题,不知道该问题的希望注意,知道内幕的高手还望给小弟一个解释 Thanks logahead - AJAX的BLOG AJAX淋漓尽致的发挥(Google个性化主页 VS. Windows Live.COM)站在互联网浪尖上窃喜 汉诺塔 - 秋雨飘飞 - 博客园 原来BT也要设置端口映射的,今天才发现 dup,dup2函数 恶心的C语言strtok函数 UNIX网络编程第一次作业基本搞定 发布这几天学习Hook搞出来的一个挺好玩的统计鼠标移动距离和键盘敲击次数的小程序 像素真实的物理长度 学习笔记-HOOK钩子(1)l 捕获网页为图像 2D绘图控件 趋势程序大赛第八天 趋势程序大赛第 六&&七 天
监视剪贴板
秋雨飘飞 · 2006-03-20 · via 博客园 - 秋雨飘飞

使用一些下载工具比如FlashGet、DuDu下载器,通常有一个选项叫做监视剪贴板,如果发现指定类型的后缀名,则自动开始下载,监视剪贴板的小技巧很有实用价值。
       下面就说说监视剪贴板的小技巧。
       Windows系统使用list或者是chain来保存当剪贴板的数据发生变化的时候要求被通知到的一些窗口。
 每一次当剪贴板的数据发生变化的时候,这个list的第一个窗口收到一个WM_DRAWCLIPBOARD系统消息, 该窗口可以查询剪贴板数据的相关信息。这个非常简单的过程,我们只要遵循下面几条说明,调用相关的win32API函数就行了。
      (1)protected static extern int SetClipboardViewer(int hWndNewViewer);
 当调用SetClipboardViewer函数的时候,需要传递接收这个消息(WM_DRAWCLIPBOARD)的窗口句柄作为参数,SetClipboardViewer 返回当前观察链中下一个窗口句柄,通常程序需要保存这个值,因为我们需要把消息传递给观察链中的下一个窗口。
      (2)处理WM_DRAWCLIPBOARD 消息
重载窗体的WndProc方法,处理消息,参看程序
      (3)处理 WM_CHANGECBCHAIN消息,因为每个处理WM_DRAWCLIPBOARD消息的窗口必须担负把消息传递个下个观察链窗口的任务。
      (4)处理WM_CHANGECBCHAIN消息,当一个窗口把自己从观察链移出时候的消息。该移出过程(程序结束时)通过调用Win32ChangeClipboardChain函数完成。
代码:

    
        [DllImport(
"User32.dll")]
        
protected static extern int SetClipboardViewer(int hWndNewViewer);

        [DllImport(
"User32.dll", CharSet=CharSet.Auto)]
        
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

        [DllImport(
"user32.dll", CharSet=CharSet.Auto)]
            
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
    IntPtr nextClipboardViewer;
    
        
protected override void WndProc(ref System.Windows.Forms.Message m)
        
{
            
// defined in winuser.h
            const int WM_DRAWCLIPBOARD = 0x308;
            
const int WM_CHANGECBCHAIN = 0x030D;

            
switch(m.Msg)
            
{
                
case WM_DRAWCLIPBOARD:
                    DisplayClipboardData();
                    SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    
break;

                
case WM_CHANGECBCHAIN:
                    
if (m.WParam == nextClipboardViewer)
                        nextClipboardViewer 
= m.LParam;
                    
else
                        SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    
break;

                
default:
                    
base.WndProc(ref m);
                    
break;
            }
    
            }

    
                
private void Form1_Closed(object sender, System.EventArgs e)
        
{
            ChangeClipboardChain(
this.Handle,NextClipHwnd);
            
//从观察链中删除本观察窗口
            SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,this.Handle,NextClipHwnd);
            
//将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口        
            }

    
        
void DisplayClipboardData()        
        
{
            
try
            
{
                IDataObject iData 
= new DataObject();  
                iData 
= Clipboard.GetDataObject();

                
if (iData.GetDataPresent(DataFormats.Rtf)) 
                    richTextBox1.Rtf 
= (string)iData.GetData(DataFormats.Rtf);
                
else if (iData.GetDataPresent(DataFormats.Text))
                    richTextBox1.Text 
= (string)iData.GetData(DataFormats.Text);
                
else
                    richTextBox1.Text 
= "[Clipboard data is not RTF or ASCII Text]";
            }

            
catch(Exception e)
            
{
                MessageBox.Show(e.ToString());
            }

            }