在視窗(表單)外繼續偵測滑鼠動作或執行程式 |
答題得分者是:aftcast
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
各位前輩好,
本人目前算是BCB的新手, 最近想要寫一個小程式可以得知滑鼠在螢幕上的座標, 再來進階去對此做控制。 搜尋了站上許多關於滑鼠指標的文章, 瞭解了很多GetCursorPos涵絕對座標與相對座標的概念。 目前將捕捉位置座標的程式寫在MouseMove的動作內也能夠成功觸發。 [code cpp] void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { POINT mspt; GetCursorPos(&mspt); Label1->Caption="(" IntToStr(mspt.x) "," IntToStr(mspt.y) ")"; } [/code] 但是一當滑鼠游標離開視窗(表單)的時候, 擷取的動作也會就此停止, 想請問該要用甚麼樣的寫法,可以讓Focus就算不是在撰寫的程式上, 程式還是可以繼續執行呢? ie. 就算滑鼠游標離開了視窗,但是視窗還是能夠繼續險是滑鼠目前所在的座標。 因為未來想要將程式縮在工具列裡, 可是還是希望能夠繼續傳送指令, 所以想說還是來板上請教一下前輩和高手好了。 先謝謝 : ) |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
謝謝兩位的幫忙,
目前有查找了關於Hook Mouse的指令, 也同樣的看了那篇Delphi的文章, 可是對於Hook的函式所表達的觀念還是略為模糊, 像是在宣告變數那裏,是要宣告為全域函數嗎? Hook函式本身又是從哪裡生出來的呢? 函式的本身需要包含在Form的哪個動作之下嗎? 因為Delphi的成是看不大懂, 雖說有找到一篇文章有將Delphi的程式碼轉為BCB的, http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=45833 但是還是有看沒有懂阿ˊˋ 而且自己試著貼了程式碼之後, 出現了一大堆錯誤, 在無從下手的時候,有誰可以提供一下意見呢, 謝謝。 |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
謝謝樓上有幫我試:D
可是我的還是依然沒有反應 : ( (...都要哭了我) Botton1 Click下去的時候 Memo1依舊是Memo1, 這會跟Vista有關係嗎? 可是程式可以執行耶~ 為什麼會這樣呢 : ( 我把程式碼貼上好了。 [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; static HHOOK hHook; LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { hHook = ::SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)hookProc,HInstance,0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { UnhookWindowsHookEx(hHook); hHook = 0; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (hHook != 0) { UnhookWindowsHookEx(hHook); hHook = 0; } } //--------------------------------------------------------------------------- LRESULT CALLBACK hookProc(int iCode, WPARAM wParam, LPARAM lParam) { TEventMsg msg; if (iCode < 0) { //必須將消息傳遞到消息鏈的下一個接受單元 return CallNextHookEx(hHook,iCode,wParam,lParam); } else if (iCode == HC_ACTION) { msg = *((TEventMsg*)(lParam)); /* 詳見MSDN中 [url="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookFunctions/JournalRecordProc.asp"]JournalRecordProc Function[/url] 的code參數說明: HC_ACTION The lParam parameter is a pointer to an EVENTMSG structure containing information about a message removed from the system queue. The hook procedure must record the contents of the structure by copying them to a buffer or file. */ if (msg.message == WM_LBUTTONDOWN) { //此行只是顯示Window Handle及x,y座標 Form1->Memo1->Lines->Add(IntToStr(msg.hwnd) ':' IntToStr(msg.paramL) '-' IntToStr(msg.paramH)); } } return NULL; } [/code] |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
我把專案以及執行檔放到
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=99541 我是用BCB6.0 Win7, XP的環境我也測試過OK ===================引 用 cusack 文 章=================== 謝謝您的回答, 程式上做了更改了... 但是!!! 依然沒動靜阿~ ˊˋ why why why 我甚至開了兩個Label想說讓他顯示在Label上, 可是依然音訊全無.... 奇怪,我到底是哪邊有錯呢??? |
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
謝謝您用心的回答
(真的很感動!非常感謝!) 用自己的電腦Vista的開啟taishyang所寫的程式, 依然不能夠執行, (按了Button之後程式還是一樣的冷漠) 剛剛開了另外一台電腦作業系統為Window XP的, 程式就可以動了!跑的可高興的呢! 就連自己剛剛所用的程式也一樣可以跑了, 所以... 這樣算是問題出在Vista身上嗎? 我知道我該知足了, 但是我還真想知道為什麼Hook不能夠在Vista的環境下執行說? 是因為是Windows api的問題嗎? 還是有甚麼設定該要去更改或者是開啟的嗎? 喏...我可以晚點設成已結案嗎ˊˋ 再次感謝taishyang的用心回答 : DDD |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
個人猜測你的VISTA電腦是不是有裝遊戲,且此遊戲會擋HOOK,讓作弊程式(滑鼠快按之類的)失效?
我住的地方的NB是用VISTA,回家測試後再跟你說 ^^ ===================引 用 cusack 文 章=================== 謝謝您用心的回答 (真的很感動!非常感謝!) 用自己的電腦Vista的開啟taishyang所寫的程式, 依然不能夠執行, (按了Button之後程式還是一樣的冷漠) 剛剛開了另外一台電腦作業系統為Window XP的, 程式就可以動了!跑的可高興的呢! 就連自己剛剛所用的程式也一樣可以跑了, 所以... 這樣算是問題出在Vista身上嗎? 我知道我該知足了, 但是我還真想知道為什麼Hook不能夠在Vista的環境下執行說? 是因為是Windows api的問題嗎? 還是有甚麼設定該要去更改或者是開啟的嗎? 喏...我可以晚點設成已結案嗎ˊˋ 再次感謝taishyang的用心回答 : DDD |
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
Vista上是有問題的 ><
google了一下看到討論與解法 http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/35c1caa5-e13a-453f-b08f-4b4dd68c50a6 其中提到下面這樣是操作OK的 Run secpol.msc - Local Policies/Security Options and modify User Account Control to disable running as standard users 但是我不知在道在[本機安全性原則]->[本機原則]->[安全性選項]裡面對應到的中文是哪個項目 >< 我記得UAC的問題用manifest文件可以解決,要請其他前輩幫忙了 影像處理的程式我都是參考站上文章寫的,太久了,我沒有備份 問題沒解決所以不用結案 ^^ |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
參照這裡 http://forum.coolaler.com/showthread.php?t=166948
把uac設定一下。然後要重新開機… 重開好後,把執行檔copy至 C:\Program Files\下,然後執行看看!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-10-08 00:40:30, 註解 無‧
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
在站上搜尋manifest的時候看到這篇文章,
在 Delphi/BCB 中加入 Windows Vista 的 UAC 提示功能 裡面有提到XML的東西, 可是是要在哪裡更改阿? 看msdn的說明文件好像也只有提到在Visual Studio 2005的做法, 那BCB的話該怎麼用呢? 麻煩高手回答了~ |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
可先以外加的方式把manifest放在同一個執行檔位置:
參考如下: https://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=90285 (其中oktony回應的那部份,有記載你要如何的去命名,還有一個要注意的事,要以utf8編碼的方式開一個新檔(ultraedit可以),然後再把它貼上) 若還不行… 真的就要用嵌入的試看看了。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-10-08 13:58:18, 註解 無‧
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
|
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
謝謝 aftcast 前輩的回答~
那想要請問要是都不行的話, 前輩所指的嵌入的方式是要怎麼使用呢? 先謝謝前輩了~ ===================引 用 aftcast 文 章=================== 可先以外加的方式把manifest放在同一個執行檔位置: 參考如下: https://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=90285 (其中oktony回應的那部份,有記載你要如何的去命名,還有一個要注意的事,要以utf8編碼的方式開一個新檔(ultraedit可以),然後再把它貼上) 若還不行… 真的就要用嵌入的試看看了。 |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
剛又再度的在網路上查相關的資訊… 應該有二種解
1/ 要花錢去買到認證然後再加入適當的manifest ( 重點uiAccess=true) 然後放入 c:\program file 下 2/ 把uac的功能關了… 我想你只能使用第二種方式了。 會關uac吧? 參照 http://ying.homedns.org/wp/2007/04/223/ 此外,你要以管理員的身份去執行程式。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
cusack
一般會員 ![]() ![]() 發表:1 回覆:10 積分:2 註冊:2009-10-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |