全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5577
推到 Plurk!
推到 Facebook!

在視窗(表單)外繼續偵測滑鼠動作或執行程式

答題得分者是:aftcast
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-07 14:25:17 IP:140.121.xxx.xxx 訂閱
各位前輩好,
本人目前算是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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-07 14:59:37 IP:122.116.xxx.xxx 訂閱
不知道有沒有更快的方法,目前想到的是採用HOOK的方式
請用[HOOK mouse]當關鍵字搜尋



aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-07 17:04:19 IP:210.64.xxx.xxx 訂閱
請參照…  也許適用

http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=58460
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-07 18:13:18 IP:140.121.xxx.xxx 訂閱
謝謝兩位的幫忙,
目前有查找了關於Hook Mouse的指令,
也同樣的看了那篇Delphi的文章,
可是對於Hook的函式所表達的觀念還是略為模糊,
像是在宣告變數那裏,是要宣告為全域函數嗎?
Hook函式本身又是從哪裡生出來的呢?
函式的本身需要包含在Form的哪個動作之下嗎?
因為Delphi的成是看不大懂,
雖說有找到一篇文章有將Delphi的程式碼轉為BCB的,
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=45833

但是還是有看沒有懂阿ˊˋ
而且自己試著貼了程式碼之後,
出現了一大堆錯誤,
在無從下手的時候,有誰可以提供一下意見呢,
謝謝。
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-07 18:27:29 IP:122.116.xxx.xxx 訂閱
錯誤訊息是?

===================引 用 cusack 文 章===================
而且自己試著貼了程式碼之後,
出現了一大堆錯誤,
在無從下手的時候,有誰可以提供一下意見呢,
謝謝。
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-07 18:53:40 IP:140.121.xxx.xxx 訂閱
我是參考這篇文章的第八個回答的程式碼下去做測試的,
剛剛又重新開了一個Project再貼上一次程式碼,
結果竟然沒有錯誤可以執行!


但是執行出來的程式,
按了兩個Button也沒人理阿....


taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-10-07 19:23:16 IP:122.116.xxx.xxx 訂閱
按下Button1就可以在Memo1上看到滑鼠的座標
按下Button2是停止Hook自然就沒作用了
我試過是可以看到效果的


===================引 用 cusack 文 章===================
我是參考這篇文章的第八個回答的程式碼下去做測試的,
剛剛又重新開了一個Project再貼上一次程式碼,
結果竟然沒有錯誤可以執行!


但是執行出來的程式,
按了兩個Button也沒人理阿....


編輯記錄
taishyang 重新編輯於 2009-10-07 19:23:57, 註解 無‧
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-10-07 19:30:32 IP:140.121.xxx.xxx 訂閱
謝謝樓上有幫我試: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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-10-07 19:43:32 IP:122.116.xxx.xxx 訂閱
sorry,忘記這行
if (msg.message == WM_LBUTTONDOWN)
要改成
if (msg.message == WM_MOUSEMOVE)
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-10-07 19:48:06 IP:140.121.xxx.xxx 訂閱
謝謝您的回答,
程式上做了更改了...



但是!!!

依然沒動靜阿~
ˊˋ
why why why
我甚至開了兩個Label想說讓他顯示在Label上,
可是依然音訊全無....

奇怪,我到底是哪邊有錯呢???

taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-10-07 20:09:56 IP:122.116.xxx.xxx 訂閱
我把專案以及執行檔放到
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-10-07 20:22:59 IP:140.121.xxx.xxx 訂閱
謝謝您用心的回答
(真的很感動!非常感謝!)

用自己的電腦Vista的開啟taishyang所寫的程式,
依然不能夠執行,
(按了Button之後程式還是一樣的冷漠)

剛剛開了另外一台電腦作業系統為Window XP的,
程式就可以動了!跑的可高興的呢!
就連自己剛剛所用的程式也一樣可以跑了,
所以...
這樣算是問題出在Vista身上嗎?

我知道我該知足了,
但是我還真想知道為什麼Hook不能夠在Vista的環境下執行說?
是因為是Windows api的問題嗎?
還是有甚麼設定該要去更改或者是開啟的嗎?

喏...我可以晚點設成已結案嗎ˊˋ

再次感謝taishyang的用心回答 : DDD
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-10-07 20:30:02 IP:122.116.xxx.xxx 訂閱
個人猜測你的VISTA電腦是不是有裝遊戲,且此遊戲會擋HOOK,讓作弊程式(滑鼠快按之類的)失效?
我住的地方的NB是用VISTA,回家測試後再跟你說 ^^


===================引 用 cusack 文 章===================
謝謝您用心的回答
(真的很感動!非常感謝!)

用自己的電腦Vista的開啟taishyang所寫的程式,
依然不能夠執行,
(按了Button之後程式還是一樣的冷漠)

剛剛開了另外一台電腦作業系統為Window XP的,
程式就可以動了!跑的可高興的呢!
就連自己剛剛所用的程式也一樣可以跑了,
所以...
這樣算是問題出在Vista身上嗎?

我知道我該知足了,
但是我還真想知道為什麼Hook不能夠在Vista的環境下執行說?
是因為是Windows api的問題嗎?
還是有甚麼設定該要去更改或者是開啟的嗎?

喏...我可以晚點設成已結案嗎ˊˋ

再次感謝taishyang的用心回答 : DDD
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-10-07 20:52:47 IP:140.121.xxx.xxx 訂閱
喏,
我目前玩過的遊戲只有踩地雷...(玩三場爆炸三場)

...身為個宅女連MSN都很少上

看來要不是我弟把電腦亂搞,我也想不到甚麼跟遊戲有關的原因了 : (

那vista的疑惑就麻煩taishyang先生了!!!
真的很感謝~~
我也會努力的找找資料的!

(另外想偷偷問你,關於您的文章有搜尋到幾篇影像處理,
真的覺得您太厲害了@@!
可是有些很棒的範例檔案沒辦法下載(影像處理III 影像處理|| 影像處理|),
想請問有別的下載區可供下載嗎?
謝謝您~)


taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-10-07 23:31:21 IP:114.137.xxx.xxx 訂閱
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文件可以解決,要請其他前輩幫忙了

影像處理的程式我都是參考站上文章寫的,太久了,我沒有備份

問題沒解決所以不用結案 ^^




編輯記錄
taishyang 重新編輯於 2009-10-07 23:36:19, 註解 無‧
taishyang 重新編輯於 2009-10-07 23:43:49, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-10-08 00:37:39 IP:61.219.xxx.xxx 訂閱
參照這裡  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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-10-08 01:00:02 IP:116.59.xxx.xxx 訂閱
aftcast前輩:

我試了您說的方式但還是沒有反應耶 ><


===================引 用 aftcast 文 章===================
參照這裡 http://forum.coolaler.com/showthread.php?t=166948

把uac設定一下。然後要重新開機…

重開好後,把執行檔copy至 C:\Program Files\下,然後執行看看!


aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-10-08 09:19:17 IP:210.64.xxx.xxx 訂閱
應該是少了 manifest 資源檔。    

manifest裡要有require administrator…

我目前的環境沒有vista,看看有誰可以加入manifest後再依我樓上講的去試看看。
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-10-08 12:25:34 IP:140.121.xxx.xxx 訂閱
在站上搜尋manifest的時候看到這篇文章,
在 Delphi/BCB 中加入 Windows Vista 的 UAC 提示功能
裡面有提到XML的東西,
可是是要在哪裡更改阿?
msdn的說明文件好像也只有提到在Visual Studio 2005的做法,
那BCB的話該怎麼用呢?

麻煩高手回答了~

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2009-10-08 13:50:39 IP:210.64.xxx.xxx 訂閱
可先以外加的方式把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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2009-10-08 14:01:18 IP:140.121.xxx.xxx 訂閱
我先是利用記事本將連結的程式碼貼上去,
然後將檔名儲存為Project1.exe.manifest,
可是還是依然沒有反應。

另外,我使用系統管理員的身分去開啟執行檔的時候,
他回傳了一個錯誤,
說是「從伺服器傳回一個轉介」

真是越來越confuse了,不知道有沒有人碰到跟我一樣的問題。

---
有用UTF-8的格式做儲存,一樣的樣子...

編輯記錄
cusack 重新編輯於 2009-10-08 14:03:34, 註解 無‧
cusack
一般會員


發表:1
回覆:10
積分:2
註冊:2009-10-06

發送簡訊給我
#22 引用回覆 回覆 發表時間:2009-10-09 10:30:06 IP:140.121.xxx.xxx 訂閱
謝謝 aftcast 前輩的回答~
那想要請問要是都不行的話,
前輩所指的嵌入的方式是要怎麼使用呢?

先謝謝前輩了~

===================引 用 aftcast 文 章===================
可先以外加的方式把manifest放在同一個執行檔位置:

參考如下:

https://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=90285

(其中oktony回應的那部份,有記載你要如何的去命名,還有一個要注意的事,要以utf8編碼的方式開一個新檔(ultraedit可以),然後再把它貼上)

若還不行… 真的就要用嵌入的試看看了。
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#23 引用回覆 回覆 發表時間:2009-10-09 11:27:28 IP:210.64.xxx.xxx 訂閱
剛又再度的在網路上查相關的資訊…  應該有二種解

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

發送簡訊給我
#24 引用回覆 回覆 發表時間:2009-10-09 11:50:10 IP:140.121.xxx.xxx 訂閱
謝謝樓上的回答!!!

關閉了UAC了,
重新開機後可以執行了,那現在我要小心一點不能讓電腦中毒了XD

不過至少不用重灌成XP了,
謝謝大家的幫忙 : )
學到了很多,以後還請多多指教

Delphi.ktop好溫馨~ :DDDD
系統時間:2017-10-21 21:56:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!