usb_spec
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:3 回覆:2 積分:1 註冊:2005-01-10
發送簡訊給我
|
大家好,我現在有個需求是要作到當我按鍵盤上的某顆key,我想要讓它能控制"Notepad"or"Word"讓它能控制水平軸,即當畫面的字數超過畫面,它會在水平軸出現scrollbar,我想要控制的不是用,鍵盤的左右鍵,來讓游標左右移動,而是要像滑鼠滾輪上下滑動時,左右bar也能像這樣的移動方式,
模擬"滑鼠滾輪上下滑動" 只需使用mouse_event 就能作到,不知道如果要作到左右移動時,該如何作呢?非常謝謝 !!!! 發表人 - usb_spec 於 2005/07/07 10:35:05
|
m8815010
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:99 回覆:372 積分:289 註冊:2003-11-13
發送簡訊給我
|
引言:
大家好,我現在有個需求是要作到當我按鍵盤上的某顆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有問題啦 )! 問題 >....
|