<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      最近在做的一個項目是一個Word 2003的插件。項目的一個需求是控制用戶在Word中的拖拽行為。具體來說有三種:

      1、用戶完全不能把某些文字Drag起來

      2、對于某些文字,可以Drag起來,但是不能Drop到除當前文檔之外的任何地方

      3、對于某些文字,任意東西都不能Drop于其上

      說實話,我了解到這個是需求的時候, 第一反應就是,這可能嗎?借用阿迪的廣告語,Impossible is Nothing。的確,Windows之所以千瘡百孔,在我看來很大程度上就是它提供了太多的可Hack的手段了。在實現這個可控的拖拽行為之前,已經通過SetWindowsHook控制了用戶的鼠標和鍵盤(當然這種技術已經用爛了,我就不再炒冷飯了)。這次,我們使用Windows API Hook來達到這個目的。

      如果不了解拖拽到底是怎么實現的,我們是不可能控制它的行為的。 我們要做的,其實就是找出標準的拖拽實現方式。然后在其中插一腳,把我們感興趣的東西攔截下來,并篡改掉本來的輸出結果。說實話,Hook的善惡就在一念之間。那么我們先來簡單了解一下拖拽的流程:

      Drag:

      1、應用程序在用戶用鼠標拖拽了一個物體之后,調用 DoDragDrop(dataObject, dropSource, okEffect, effects) 開始拖拽

      2、Windows 回調 dropSource 的 QueryContinueDrag 來決定是不是繼續Drag

      Drop:

      1、應用程序在初始化的時候,調用 RegisterDragDrop(hwnd, dropTarget)

      2、當有物體拖拽進了 hwnd 所在的區域時,Windows 回調 dropTarget 的 DragEnter

      3、當物體在 hwnd 所在區域內滑動時,Windows 回調 dropTarget 的 DragOver

      4、當物體拖拽出 hwnd 所在區域時,Windows 回調 dropTarget 的 DragLeave

      5、當拖拽的物體放下是,Windows 回調 dropTarget 的 Drop

      所以對于我們來說,重點關注的就是兩個API,兩個Com Interface。分別是 Ole32 的 DoDragDrop 和 RegisterDragDrop。以及 Ole32 中的 IDropTarget, IDropSource。要實現開頭所述的三種行為,我們只需要:

      1、 用戶完全不能把某些文字Drag起來:

      攔截DoDragDrop的調用,如果dataObject或者用戶當前選中的區域是受到保護的,就不調用Ole32的真實實現,直接返回0。

      2、 對于某些文字,可以Drag起來,但是不能Drop到除當前文檔之外的任何地方:

      攔截DoDragDrop的調用,真實地去調用Ole32的真實實現,但是不直接使用原裝的DropSource(包裝之后再用)。因為我們要監聽Windows對DropSource的回調,再“恰當”的時候篡QueryContinueDrag的返回值。從而使得用戶無法Drop到當前文檔之外的區域。

      3、 對于某些文字,任意東西都不能Drop于其上:

      攔截RegisterDragDrop的調用,確實使用Ole32的真實實現,但是也不直接使用原裝的DropTarget(包裝之后再用)。因為我們要監聽Windows對DropTarget的回調。同樣,在“恰當” 的時候篡改DragOver和Drop的返回值。

      那么問題就集中在了如何攔截Ole32的兩個API上。這個問題很好解決,直接使EasyHook(http://www.codeplex.com/easyhook)庫就行了。我閱讀了這個庫的所有源代碼,有機會可以給大家講講Windows API Hook的原理,也挺有意思的。而且使用EasyHook,我們還可以做到遠程注入(底層實現是CreateRemoteThread,老套但是可靠,關鍵是支持.NET)。這樣,就不用受限于當前進程了。不過由于RegisterDragDrop一般在初始化的時候調用,所以最好使用EasyHook的CreateAndInject來做,要不然就時機太晚了。在本例中是一個Word 2003的插件,而且恰巧Word 2003是先加載AddIn再RegisterDragDrop,要不然也就Hook無門了。

      下面是一些關鍵細節的源代碼:

      安裝DoDragDrop的鉤子

      Code

      安裝RegisterDragDrop的鉤子

      Code

      把Drag的物體“Jail”在當前文檔中

      Code

      監聽DropTarget的回調,拒絕某些場合下的Drop下來東西

      Code

       

      posted on 2008-10-30 22:27  taowen  閱讀(4456)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 精品午夜福利无人区乱码| 小污女小欲女导航| 丁香花成人电影| 欧美日韩视频综合一区无弹窗| 国产成人剧情AV麻豆果冻| 亚洲蜜臀av乱码久久| 狠狠爱俺也去去就色| 99久久激情国产精品| 疯狂做受xxxx高潮欧美日本| 色呦呦九九七七国产精品| 国产成A人片在线观看视频下载| 国产精品高清国产三级囯产AV| 中国女人熟毛茸茸A毛片| 绥滨县| 中文字幕成熟丰满人妻| 国产免费播放一区二区三区| 精品国产乱码久久久久久影片| 天堂va亚洲va欧美va国产| 国产免费久久精品44| 久久精品免视看国产成人| 狼色精品人妻在线视频| 激情综合网五月婷婷| 国产美女69视频免费观看| 国产偷拍自拍视频在线观看| 国产三级国产精品国产专区| 四虎国产精品永久地址99| 国产综合有码无码中文字幕| 日本高清一区免费中文视频| 欧美野外伦姧在线观看| 国产亚洲色视频在线| 精品国产午夜福利伦理片| 峨眉山市| 成人精品网一区二区三区| 狠狠色狠狠色综合| 国产一区二区三区不卡视频| 国产免费久久精品44| 日韩有码中文字幕一区二区 | 亚洲熟女精品一区二区| 中文字幕成人精品久久不卡| 亚洲人成电影在线天堂色| 九九热免费在线播放视频|