線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5753
推到 Plurk!
推到 Facebook!

【BCB】【問題】有關滑鼠控制?

 
usb_spec
一般會員


發表:3
回覆:2
積分:1
註冊:2005-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-07 08:52:34 IP:60.248.xxx.xxx 未訂閱
大家好,我現在有個需求是要作到當我按鍵盤上的某顆key,我想要讓它能控制"Notepad"or"Word"讓它能控制水平軸,即當畫面的字數超過畫面,它會在水平軸出現scrollbar,我想要控制的不是用,鍵盤的左右鍵,來讓游標左右移動,而是要像滑鼠滾輪上下滑動時,左右bar也能像這樣的移動方式, 模擬"滑鼠滾輪上下滑動" 只需使用mouse_event 就能作到,不知道如果要作到左右移動時,該如何作呢?非常謝謝 !!!! 發表人 - usb_spec 於 2005/07/07 10:35:05
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-27 22:21:09 IP:203.73.xxx.xxx 未訂閱
引言: 大家好,我現在有個需求是要作到當我按鍵盤上的某顆key,我想要讓它能控制"Notepad"or"Word"讓它能控制水平軸,即當畫面的字數超過畫面,它會在水平軸出現scrollbar,我想要控制的不是用,鍵盤的左右鍵,來讓游標左右移動,而是要像滑鼠滾輪上下滑動時,左右bar也能像這樣的移動方式, 模擬"滑鼠滾輪上下滑動" 只需使用mouse_event 就能作到,不知道如果要作到左右移動時,該如何作呢?非常謝謝 !!!! 發表人 - usb_spec 於 2005/07/07 10:35:05
usb_spec你好: 稍微研究了一下, >.... < class="code"> In Dll: ~~~~ #pragma argsused HHOOK hMouseHook; //mouse hook的handle值 HWND hApp; //我方程式的handle值(由呼叫DLL的程式傳入) HWND hNotePad; //記事本的handle值(由呼叫DLL的程式傳入) LRESULT CALLBACK MouseProc(int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ); extern "C" __declspec(dllexport) __stdcall void SetMouseHook(HWND hnotepad,HWND happ); extern "C" __declspec(dllexport) __stdcall void UnHook(void); //--------------------------------------------------------------------------- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- void __stdcall SetMouseHook(HWND hnotepad,HWND happ) { hNotePad = hnotepad; //儲存記事本視窗的handle值 hApp = happ; //儲存呼叫DLL程式其handle值 hMouseHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)MouseProc,HInstance,0); if (hMouseHook==NULL) ShowMessage("Hook Error!"); } //--------------------------------------------------------------------------- void __stdcall UnHook(void) { UnhookWindowsHookEx(hMouseHook); } //--------------------------------------------------------------------------- LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode>=0) { if (nCode==HC_ACTION) { EVENTMSG* eventmsg=(EVENTMSG*)lParam; if (GetForegroundWindow()==hNotePad) { //當正在操作記事本時 if (eventmsg->message==WM_MOUSEWHEEL) { //當操作的滑鼠滾動時 //--------問題題1--------// short zDelta = (short)LOWORD(eventmsg->paramL); SendMessage(hApp,WM_USER 1234,zDelta,0); //送出訊息做對應的處理 //--------問題題2--------// return -1; //erase此訊息 } } } return 0; } return CallNextHookEx(hMouseHook,nCode,wParam,lParam); } In .h: ~~~~ class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TButton *Button2; void __fastcall FormCreate(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // User declarations TWndMethod OldFormWndProc; void __fastcall FormWndProc(TMessage& Message); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; ~~~~ In .cpp: ~~~~ TForm1 *Form1; HWND hNotePad = NULL; //NotePad視窗的handle值 HWND hEdit = NULL; //NotePad上Edit物件的handle值 HINSTANCE inst=NULL; //DLL handle值 //void (*SetMouseHook)(HWND hnotepad,HWND happ); //void (*UnHook)(void); void WINAPI (*SetMouseHook)(HWND hnotepad,HWND happ); //mouse hook函式宣告 void WINAPI (*UnHook)(void); //解除hook函式宣告 BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam); //列舉子視窗函式 //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldFormWndProc = this->WindowProc; //舊Form的message process函式 this->WindowProc = FormWndProc; //新Form的message process函式 } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { inst=LoadLibrary("Project2.dll"); //得到DLL handle值 if (inst==NULL) { ShowMessage("Load dll file error!"); return; } (FARPROC &)SetMouseHook=GetProcAddress(inst,"SetMouseHook"); //實際函式取得 (FARPROC &)UnHook=GetProcAddress(inst,"UnHook"); //實際函式取得 if (SetMouseHook==NULL) { ShowMessage("Load function 'SetMouseHook' error!"); return; } if (UnHook==NULL) { ShowMessage("Load function 'UnHook' error!"); return; } hNotePad=FindWindow(NULL,"未命名 - 記事本"); //取得NotePad視窗handle值 if (hNotePad==NULL) { ShowMessage("找不到記事本視窗的handle值!"); return; } EnumChildWindows(hNotePad,(WNDENUMPROC)EnumChildProc,0); //取得Edit物件的handle值 if (hEdit==NULL) ShowMessage("找不到Edit視窗的handle值"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { FreeLibrary(inst); //釋放DLL } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SetMouseHook(hNotePad,Form1->Handle); //開始hook mouse } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { UnHook(); //解除hook mouse } //--------------------------------------------------------------------------- void __fastcall TForm1::FormWndProc(TMessage& Message) { OldFormWndProc(Message); if (Message.Msg==WM_USER 1234) { //當收到對應訊息時,開始動作 if (hEdit) SendMessage(hEdit,WM_HSCROLL,SB_LINERIGHT,0); //讓記事本水平scroll } } //--------------------------------------------------------------------------- BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam) { char classname[256]; ZeroMemory(classname,256); GetClassName(hwnd,classname,256); if (AnsiString(classname)=="Edit") { hEdit=hwnd; return false; } return true; } 問題1 是雖然有hook到wm_mousewheel事件,但發現卻抓不到其對應的滾動值,所以沒辦法 判斷是向前或向下滾動,又滾動了多少!(當然也不排除整個hook function有問題啦)! 問題 >....
系統時間:2024-05-03 16:01:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!