2013-01-14 57 views
2

我是新來的Windows編程,主要完成Java(Java SE,Java ME,Android,Java EE),所以要細緻和溫和。我可以使用Global System Hooks來捕獲哪個文件被點擊嗎?

我想捕獲「在窗口中單擊的文件/路徑的名稱,如單擊桌面上的文件」?

進一步研究http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET,這是一個小型的C#/ C + +很好的應用程序,使用全球系統鉤子捕捉鼠標事件,如座標,點擊等。

那麼什麼是正確的API或全局系統鉤子捕獲文件圖標上的事件?

回答

4

沒有一個API提供了詳細程度。

WH_MOUSEWH_MOUSE_LLSetWindowsHookEx(),或RegisterRawInputDevices()交付WM_INPUT消息,可以告訴當鼠標正與intereacted和GetCursorPos()功能可以告訴你的鼠標光標在屏幕上位於點擊時間,但它不能告訴你它是什麼點擊。你必須手動解決這個問題。

例如,桌面被實現爲ListView控件,這樣你就可以使用WindowFromPoint()GetDesktopWindow()功能檢查,如果鼠標位於與桌面窗口本身,而不是一個應用程序窗口座標,如果這樣的話使用LVM_HITTESTLVM_GETITEM消息來確定正在點擊桌面上的哪個圖標並提取其顯示文本。然後使用SHGetDesktopFolder()函數和IShellFolder接口或SHParseDisplayName()函數解析該文本,並查看它是否返回表示路徑/文件的PIDL,如果是,則使用SHGetPathFromIDList()來獲取實際的路徑/文件名。

如果你想用Windows資源管理器應用程序做同樣的事情,它會變得更復雜一點。使用WindowFromPoint(),GetWindowThreadProcessId(),OpenProcess()EnumProcessModules()來確定鼠標是否在Windows資源管理器應用程序上。但是,它的用戶界面從Windows版本更改爲下一版本,但問題是您必須通過AttachThreadInput()GetActiveWindow()手動定位集中控制,檢查它是否是TreeView/ListView控件,如果是,則使用特定於控件的消息獲取有關鼠標光標座標下的項目/圖標的信息,並再次使用IShellFolder來確定該項目/圖標的文本實際表示的內容。

殼牌編程是非常複雜的系統,並不是爲了與心靈的佯攻進行交互。所以你需要問自己,爲什麼你首先需要這些信息?

相關問題