【BCB】【問題】有關滑鼠控制? |
|
usb_spec
一般會員 發表:3 回覆:2 積分:1 註冊:2005-01-10 發送簡訊給我 |
大家好,我現在有個需求是要作到當我按鍵盤上的某顆key,我想要讓它能控制"Notepad"or"Word"讓它能控制水平軸,即當畫面的字數超過畫面,它會在水平軸出現scrollbar,我想要控制的不是用,鍵盤的左右鍵,來讓游標左右移動,而是要像滑鼠滾輪上下滑動時,左右bar也能像這樣的移動方式,
模擬"滑鼠滾輪上下滑動" 只需使用mouse_event 就能作到,不知道如果要作到左右移動時,該如何作呢?非常謝謝 !!!! 發表人 - usb_spec 於 2005/07/07 10:35:05
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 大家好,我現在有個需求是要作到當我按鍵盤上的某顆key,我想要讓它能控制"Notepad"or"Word"讓它能控制水平軸,即當畫面的字數超過畫面,它會在水平軸出現scrollbar,我想要控制的不是用,鍵盤的左右鍵,來讓游標左右移動,而是要像滑鼠滾輪上下滑動時,左右bar也能像這樣的移動方式, 模擬"滑鼠滾輪上下滑動" 只需使用mouse_event 就能作到,不知道如果要作到左右移動時,該如何作呢?非常謝謝 !!!! 發表人 - usb_spec 於 2005/07/07 10:35:05usb_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有問題啦)! 問題 >.... |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |