praegune kellaaeg 20.06.2025 20:51:58
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
neros
HV Guru

liitunud: 26.11.2003
|
31.12.2008 22:15:18
Kindlate klahvide intercept/forwarding (hook)? |
|
|
Nii, põhimõtteliselt olen ma (taaskord) veebi läbi sirvinud kuid teemakohast ei osanud küll olemasolevast materjalist kokku panna.
Tarvis oleks siis vihjeid kuidas teha sellist asja:
Taustal lahti olev programm, mis kontrollib kas üks kindel programm on avatud, ning kui on, siis interceptib sealt ainult teatud klahve ning saadab muud klahvid programmile edasi.
A la, internet explorer on "aktiivne", ma vajutan klaviatuuril "A", programm näeb seda, aga saadab internet explorerile hoopis "B". Aga kui ma vajutan "C", siis programm ignoreeriks seda ning "C" läheks otse IE'le, ning kui ma vajutan nt "Esc" siis programm pausiks oma töö seniks kuni vajutan "Enter". Lisaks, kui internet explorer ei ole aktiivne, programm jällegi kord ignoreeriks kõiki klahve.
Ma isegi kunagi kirjutasin midagi mis programmile keysid saadab, aga vat seda kuidas saada programmile saadetud keyse interceptida.... mitte ei suuda leida, ehk keegi juhendaks õigele teele?
|
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
31.12.2008 23:44:36
Re: Kindlate klahvide intercept/forwarding (hook)? |
|
|
madedog kirjutas: |
Nii, põhimõtteliselt olen ma (taaskord) veebi läbi sirvinud kuid teemakohast ei osanud küll olemasolevast materjalist kokku panna.
Tarvis oleks siis vihjeid kuidas teha sellist asja:
Taustal lahti olev programm, mis kontrollib kas üks kindel programm on avatud, ning kui on, siis interceptib sealt ainult teatud klahve ning saadab muud klahvid programmile edasi.
A la, internet explorer on "aktiivne", ma vajutan klaviatuuril "A", programm näeb seda, aga saadab internet explorerile hoopis "B". Aga kui ma vajutan "C", siis programm ignoreeriks seda ning "C" läheks otse IE'le, ning kui ma vajutan nt "Esc" siis programm pausiks oma töö seniks kuni vajutan "Enter". Lisaks, kui internet explorer ei ole aktiivne, programm jällegi kord ignoreeriks kõiki klahve.
Ma isegi kunagi kirjutasin midagi mis programmile keysid saadab, aga vat seda kuidas saada programmile saadetud keyse interceptida.... mitte ei suuda leida, ehk keegi juhendaks õigele teele? |
millega proged? või noh vahet pole, winapi funktsioone saab tänapäeval igas keeles enamasti kasutada(python, ruby, midaiganes..)
põhimõtteliselt ma ei kujuta ette kui raske/lihtne see on aga kindlasti tehtav(pole ise kunagi teinud) aga võin sulle juhtnööre anda millega arvatavasti saab selle asja ära tehtud(võimalik,et viiruse tõrjele selline asi ei meeldi):
SetWindowsHookEx() - selle abil saad sa siis näiteks teatud programmi asju nn jälgida enne kui nad päriselt programmini jõuavad
CallNextHook() - et anda klahvi väärtus edasi
// kindlasti on vaja veel kasutada funktsioone millega määrata ära mis programmi sa hookida tahad
aga nii see peaks olema..
kui hätta jääd koodiga siis küsi, proovin aidata, aga kui ei suuda lihtsalt ise ära teha siis võta minuga ühendust ja väikese tasu eest teen ära
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
01.01.2009 03:21:46
|
|
|
Ahjaa, unustasin täitsa mainimata, eriti vahet pole millega teen, ilmselt .NET'iga tuleb proge ise natuke kiirem. Tahan lihtsalt harjutamise pärast teha kuna endal oleks sellist proge vaja, ning ise tehtud on ikka hea
Aga, CallNextHook... hmm, ma tõesti sellesarnast teemat ei leidnud, SetWindowsHookEx oli olemas aga midagi peale hakata ei osanud, na vat! Eks proovin!
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
01.01.2009 09:56:11
|
|
|
Okei, ma olen öö otsa nüid sellega tegelenud. Akna leiab üles. Hookida ka NAGU õnnestuks.
Aga... miskipärast ei kutsuta kunagi vastavat hooki proci välja..
Kood siis selline
c#:
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : Form { // DLL imports... [DllImport("user32.dll")] static extern int GetForegroundWindow(); [DllImport("user32.dll")] static extern int GetWindowThreadProcessId(int hWnd, ref int ProcessId); [DllImport("user32.dll")] static extern int GetWindowText(int hWnd, StringBuilder text, int count); [DllImport("user32.dll")] static extern int SetWindowsHookEx(int idHook, HookProc lpfn, int hInstance, int threadId); [DllImport("user32.dll")] static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll")] static extern int CallNextHookEx(int idHook, int nCode, int wParam, int lParam); // Delegate  public delegate int HookProc(int nCode, int wParam, int lParam); // Declare hookprocedure HookProc KbHookProc = null; // Some variables and constants int hHook = 0; public const int WH_KEYBOARD = 2; public const int HC_ACTION = 0; public const int VK_LSHIFT = 0xA0; public const int VK_RSHIFT = 0xA1; // To get process' thread ID private int GetProcessThreadFromHandle(int hWnd) { int processId = 0; int threadId = GetWindowThreadProcessId(hWnd, ref processId); return processId; } // Check if the active window is what we want it to be, if so, return true private bool ActiveWindow() { const int nChars = 256; int handle = 0; // Trying out some stuff here StringBuilder WindowTitle = new StringBuilder (nChars ); handle = GetForegroundWindow(); // Check if it even has a title if (GetWindowText(handle, WindowTitle, nChars) > 0) { this.textBox1.Text = WindowTitle.ToString(); // Compare to what we want if (WindowTitle.ToString() == "karri.txt - Notepad") return true; else return false; } else return false; } //////////////////////////////// // Initialize ze form //////////////////////////////// public Form1() { InitializeComponent(); } //< Keyboard hook procedure public int Proc(int nCode, int wParam, int lParam) { //For some reason, this whole function never seems to get called out?? // Check if an action was performed if (nCode == HC_ACTION) { // And start switching... switch (wParam) { case VK_LSHIFT: MessageBox.Show("Left shift"); Form1.ActiveForm.Text = "Left shift pressed!"; break; case VK_RSHIFT: Form1.ActiveForm.Text = "Right shift pressed!"; break; } } return (CallNextHookEx(hHook, nCode, wParam, lParam)); } // Keyboard hook function > // Timer ticks every millisecond (prolly too fast?) to check // Whether foreground window is what we want it to be private void timer1_Tick(object sender, EventArgs e) { if (ActiveWindow()) { // Get process ID int PID = GetProcessThreadFromHandle(GetForegroundWindow()); // Check if hook isn't already set if (hHook == 0) { // If not, create a new procedure KbHookProc = new HookProc (Proc ); // And create the hook hHook = SetWindowsHookEx(WH_KEYBOARD, KbHookProc, 0, AppDomain.GetCurrentThreadId()); // If creating hook failed, let the user know! if (hHook == 0) { textBox1.Text = "SetWindowsHookEx Failed"; return; } richTextBox1.Text += "\nHooked"; } // Process ID into textbox textBox1.Text = Convert.ToString(hHook)+" "+Convert.ToString(PID); } else // And if it's not, unhook! { if (hHook != 0) { bool ret = UnhookWindowsHookEx(hHook); if (ret == false) { textBox1.Text = "UnhookWindowsHookEx failed"; return; } richTextBox1.Text += "\nUnhooked"; hHook = 0; } textBox1.Text = "Not the right window."; } // If (ActiveWindow()) else } } }
|
Ehk siis funktsioon Proc ei tööta millegipärast. Või pigem, teda ei kutsuta kunagi välja.
Natuke oli abiks järgmine leht: http://codeidol.com/csharp/csharpckbk2/Delegates,-Events,-and-Anonymous-Methods/Using-the-Windows-Keyboard-Hook/#csharpckbk2-CHP-9-EX-13
Kuigi jällegi, kui ma selle näite kopeerisin uude projekti ja käima lasin... ei tuvastatud ühtegi klahvi ära. Ehk siis... Vista probleem? Nagu oleks adminnina käima lasknud selle proge...
|
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
01.01.2009 16:58:12
|
|
|
lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
|
see asi veits raskem, nimelt SetWindowsHookEx() tahab,et funktsioon oleks samas kohas kus protsess, seega kui sa ütled windowsile umbes,et "vaata notepad.exe't ja kui midagi näed siis kutsu funktsioon aadressil #<sinu .net application HookProc() funktsiooni aadress> siis selline asi ei lähe mitte kuidagi läbi, miks ei lähe, sellele kahjuks vastust anda ei oska aga kindlasti on seal mingi lihtne seletus, mis siis teha saad on see,et teed omale DLL faili kus sees on Proc() funktsioon mis sul hetkel on ning kindlasti vaata,et see funktsioon ei muutuks kompileerimise ajal(mul oli nii,et kui .def faili funktsiooni nimesi DLL kohta ei kirjutanud siis DLL'ile pandi suvalised funktsiooni nimed ja pärast ei saanudki neile ligi)..
et siis umbes midagi sellist:
hHook = SetWindowsHookEx(WH_KEYBOARD, KbHookProc, 0, AppDomain.GetCurrentThreadId()); |
peaks olema
hHook = SetWindowsHookEx(WH_KEYBOARD, (void *)GetProcAddress(LoadLibrary("SInu dll"), "Hook"), 0, AppDomain.GetCurrentThreadId()); |
(See kood ei ole valideeruv .net'iga kohe kindlasti nii,et sa pead seda tsipa muutma siis..)
//edit räme süntaks sellel .net'il,
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
01.01.2009 19:02:33
|
|
|
Kas teeki ei peaks kasutama ainult siis kui globalhookida? Tho eks ma proovin.
|
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
01.01.2009 21:02:13
|
|
|
Soovitan uurida näidist aadressilt http://www.codeproject.com/KB/cs/globalhook.aspx
Seal ongi tehtud spetsiaalne dll, mida siis põhiprojekt kasutab. Too küll hookib ennast global keypresside külge mitte ainult antud programmi keypresside külge, aga põhiline töötav loogika on olemas, sealt edasi saad juba ise edasi aretada.
Ma ise proovisin ja ei saanud mitte kuidagi teisest programmist key evente kätte, kui siis ainult global hookimist kasutades.
Proovisin ka ise järgi, põhiline võtmepunkt ongi see, et seal dll's olevas klassis peab tegema:
//WH_KEYBOARD_LL = 13
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KbHookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
Siis peaksid ilusti saama oma eventid kätte ja sealt saad juba edasi aretada, edu uurimisel siis
_________________ Upload.ee - eestimaine failiupload |
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|