Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Препоръчан отговор


Тука има сорс кода на една програмка, която показва натиснатите клавиши и бутони на мишката:

https://github.com/Phaiax/PxKeystrokesForScreencasts/commit/62a380230f1ec38447e6c491c7ff64ed838bf354?diff=unified

Като цяло е приятно програмче, ама нещо не съм доволен от качеството на изобразяваната на екрана мишка, та затова използвам друга. Има и други подобни програми, ама само тази е с отворен сорс код.

Обаче въпроса ми е друг. Може ли да се създаде on the fly assembly, което да връща само натиснатия клавиш?Давам и пример за on the fly assembly:

 

function GetWinClass =
    (
        source = ""
        source += "using System;\n"
        source += "using System.Runtime.InteropServices;\n"
        source += "public class Window\n"
        source += "{\n"
        source += "    [DllImport(\"user32.dll\")]\n"
        source += "    public static extern bool SetWindowPos(int hWnd, int hWndArg, int Left, int Top, int Width, int Height, int hWndFlags);\n"
        source += "    [DllImport(\"user32.dll\")]\n"
        source += "    static extern bool GetWindowRect(int hWnd, out POS rect);\n"
        source += "    public struct POS\n"
        source += "    {\n"
        source += "        public int Left;\n"
        source += "        public int Top;\n"
        source += "        public int Right;\n"
        source += "        public int Bottom;\n"
        source += "    }\n"
        source += "    public int[] GetWindowPosAndSize(int hWnd)\n"
        source += "    {\n"
        source += "        POS rect;\n"
        source += "        if ( GetWindowRect(hWnd, out rect) )\n"
        source += "        {\n"
        source += "            return new int[] { rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top };\n"
        source += "        }\n"
        source += "        return null;\n"
        source += "    }\n"
        source += "}\n"
      
        csharpProvider = dotnetobject "Microsoft.CSharp.CSharpCodeProvider"
        compilerParams = dotnetobject "System.CodeDom.Compiler.CompilerParameters"
        compilerParams.GenerateInMemory = on
        compilerResults = csharpProvider.CompileAssemblyFromSource compilerParams #(source)
        compilerResults.CompiledAssembly.CreateInstance "Window"
    )
    if miauuWindClass_efioj98 == undefined do global miauuWindClass_efioj98 = GetWinClass()
  
    pos = ::miauuWindClass_efioj98.GetWindowPosAndSize hwndMove[1] 

Пояснявам какво разбирам по on the fly assembly

Цитат

on the fly assembly  се използва, когато няма нужда да се компилира кода в dll или някаква друга библиотека. Както виждаш от примера, който съм дал С# кода е преобразуван в стринг, който се компилира в момента, в който кода се зареди в някоя програма. Предполагам, че ако същия код се напише и компилира ще върши същата работа, но тогава ще трябва да се "доставя" и зарежда и съответния dll файл. А така, с On the fly assembly кода се зарежда само ако ще се използва.

 

Питам, защото в сорс кода на програмата има и кода, който прихваща натиснатите клавиши, и съответно ги показва в интерфейса на самата програма, ама на мен това не ми трябва. Трябва ми on fly assembly, което като го питам кой е натиснатия клавиш да ми връща правилния резултата под някаква форма(стринг или нещо друго).

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Според мен цялото нещо е голямо изсилване и би могло да се направи доста по-просто с AutoHotkey (даже си залагам шапката, че някой вече го е направил).

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 1 час, killchain написа:

Според мен цялото нещо е голямо изсилване и би могло да се направи доста по-просто с AutoHotkey (даже си залагам шапката, че някой вече го е направил).

С Autohotkey вече е направено(имам готов код). И с C# вече е направено - дал съм линк към сорс кода в github. Работата е там, че С# мога да го използвам както ми е удобно(при наличние на оn the fly assembly), докато autohotkey не мога.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 13 часа, A.com написа:

Обаче въпроса ми е друг. Може ли да се създаде on the fly assembly, което да връща само натиснатия клавиш?Давам и пример за on the fly assembly:

Искаш да разкараш събитията, които идват от мишката ли? Ако е така, бих опитал да закометирам / изтрия следния фрагмент от PxKeystrokesUi/MouseHook.cs :

RegisterMouseHook();

на ред 28.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 6 часа, Melmak ® написа:

Искаш да разкараш събитията, които идват от мишката ли? Ако е така, бих опитал да закометирам / изтрия следния фрагмент от PxKeystrokesUi/MouseHook.cs :

RegisterMouseHook();

на ред 28.

Този файл не отговаря ли само за събитията от мишката - натискане на ляв, среде, десен бутон, двоен клик и т.н.?

Аз искам да знам какво се натиска по клавиатурата. Може би тези два файла са важните:

https://github.com/Phaiax/PxKeystrokesForScreencasts/blob/master/PxKeystrokesUi/KeyboardHook - Kopieren.cs

https://github.com/Phaiax/PxKeystrokesForScreencasts/blob/master/PxKeystrokesUi/KeyboardHook.cs

 


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

То тогава ще стане с един switch case като се опишат всички клавиши

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 26 минути, petie1 написа:

То тогава ще стане с един switch case като се опишат всички клавиши

Докарах го до тук:

(
	global MouseOps
	fn CreateMouseOps forceRecompile:on =
	(
		if forceRecompile or not iskindof MouseOps dotnetobject or (MouseOps.GetType()).name != "Assembly" do
		(
			src = ""			
			src += "using System;"
			src += "using System.Text;"
			src += "using System.Collections.Generic;"
			src += "using System.Runtime.InteropServices;"
			src += "using System.Windows.Forms;  " 

			src += "public class GlobalKeyboardHook"
			src += "{"
			src += "   [DllImport(\"user32.dll\")]"
			src += "    static extern int CallNextHookEx(IntPtr hhk, int code, int wParam, ref keyBoardHookStruct lParam);"
			src += "   [DllImport(\"user32.dll\")]"
			src += "   static extern IntPtr SetWindowsHookEx(int idHook, LLKeyboardHook callback, IntPtr hInstance, uint theardID);"
			src += "    [DllImport(\"user32.dll\")]"
			src += "   static extern bool UnhookWindowsHookEx(IntPtr hInstance);"
			src += "   [DllImport(\"kernel32.dll\")]"
			src += "   static extern IntPtr LoadLibrary(string lpFileName);"

			 src += "   public delegate int LLKeyboardHook(int Code, int wParam, ref keyBoardHookStruct lParam);"

			src += "   public struct keyBoardHookStruct"
			src += "    {"
			src += "       public int vkCode;"
			src += "       public int scanCode;"
			src += "       public int flags;"
			src += "       public int time;"
			src += "      public int dwExtraInfo;"
			src += "   }"

			src += "   const int WH_KEYBOARD_LL = 13;"
			src += "   const int WM_KEYDOWN = 0x0100;"
			src += "   const int WM_KEYUP = 0x0101;"
			src += "   const int WM_SYSKEYDOWN = 0x0104;"
			src += "   const int WM_SYSKEYUP = 0x0105;"

			 src += "   LLKeyboardHook llkh;"
			src += "    public List<Keys> HookedKeys = new List<Keys>();"

			 src += "   IntPtr Hook = IntPtr.Zero;"

			 src += "   public event KeyEventHandler KeyDown;"
			 src += "   public event KeyEventHandler KeyUp;"

			   
			src += "   public GlobalKeyboardHook()"
			src += "   {"
			src += "       llkh = new LLKeyboardHook(HookProc);"
			src += "    }"
			src += "    ~GlobalKeyboardHook()"
			src += "   { unhook(); }"

			src += "    public void hook()"
			src += "   {"
			src += "        IntPtr hInstance = LoadLibrary(\"User32\");"
			src += "       Hook = SetWindowsHookEx(WH_KEYBOARD_LL, llkh, hInstance, 0);"
			src += "   }"

			src += "    public void unhook()"
			src += "   {"
			src += "        UnhookWindowsHookEx(Hook);"
			src += "    }"

			src += "    public int HookProc(int Code, int wParam, ref keyBoardHookStruct lParam)"
			src += "   {"
			src += "       if (Code >= 0)"
			src += "        {"
			src += "           Keys key = (Keys)lParam.vkCode;"
			src += "           if (HookedKeys.Contains(key))"
			src += "           {"
			src += "               KeyEventArgs kArg = new KeyEventArgs(key);"
			src += "                if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))"
			src += "                   KeyDown(this, kArg);"
			src += "               else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))"
			src += "                  KeyUp(this, kArg);"
			src += "               if (kArg.Handled)"
			src += "                   return 1;"
			src += "            }"
			src += "        }"
			src += "        return CallNextHookEx(Hook, Code, wParam, ref lParam);"
			src += "    }"
			
-- 			src += "public GlobalKeyboardHook gHook"
-- 			src += "private void Form1_Load(object sender, EventArgs e)"
-- 			src += "{"
-- 			src += " gHook = new GlobalKeyboardHook();"
-- 			src += " gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);"
-- 			src += "foreach (Keys key in Enum.GetValues(typeof(Keys)))"
-- 			src += " gHook.HookedKeys.Add(key);"
-- 			src += "}"

-- 			src += "public void gHook_KeyDown(object sender, KeyEventArgs e)"
-- 			src += "{"
-- 			src += " return ((char)e.KeyValue).ToString();"
-- 			src += "}"

-- 			src += "private void button1_Click(object sender, EventArgs e)"
-- 			src += "{"
-- 			src += "gHook.hook();"
-- 			src += "}"

-- 			src += "private void button2_Click(object sender, EventArgs e)"
-- 			src += "{"
-- 			src += "gHook.unhook();"
-- 			src += "}"

-- 			src += "private void Form1_FormClosing(object sender, FormClosingEventArgs e)"
-- 			src += "{"
-- 			src += " gHook.unhook();"
-- 			src += "}"

			src += "}"


			local csharpProvider = dotnetobject "Microsoft.CSharp.CSharpCodeProvider"
			local compilerParams = dotnetobject "System.CodeDom.Compiler.CompilerParameters"
				
			compilerParams.ReferencedAssemblies.addRange #("System.dll","System.Windows.Forms.dll","System.Drawing.dll")
			compilerParams.GenerateInMemory = on
			local compilerResults = csharpProvider.CompileAssemblyFromSource compilerParams #(src)
			
			for er =0 to compilerResults.errors.count-1 do print (compilerResults.errors.item[er].tostring())
			mouseOps = compilerResults.CompiledAssembly.CreateInstance "GlobalKeyboardHook"

		)
	)
	global VMouse = CreateMouseOps()
	global getMouseButtons = VMouse.hook

Проблемни са редовете, които започват с --(две тирета)

Кода съм го взел от тук:

Тази част, която започва с тиретата трябва някакви да се вмъкне в кода над нея, така че да мога да използвам целия код без наличието на отделен диалогов прозорец с бутончета и текстово поле, в което да се показват натиснатите клавиши.

 

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
src += "public void gHook_KeyDown(object sender, KeyEventArgs e)"
-- 			src += "{"
-- 			src += " return ((char)e.KeyValue).ToString();"
-- 			src += "}"

Мисля че ей тоя код ти е достатъчен и в него си описваше какво да ти показва

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 6 минути, petie1 написа:
src += "public void gHook_KeyDown(object sender, KeyEventArgs e)"
-- 			src += "{"
-- 			src += " return ((char)e.KeyValue).ToString();"
-- 			src += "}"

Мисля че ей тоя код ти е достатъчен и в него си описваше какво да ти показва

Ще трябва и тази част да се вмъкне, защото според мен тя зарежда всички клавиши чието натискане да се следи:

-- 			src += "public GlobalKeyboardHook gHook"
-- 			src += "private void Form1_Load(object sender, EventArgs e)"
-- 			src += "{"
-- 			src += " gHook = new GlobalKeyboardHook();"
-- 			src += " gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);"
-- 			src += "foreach (Keys key in Enum.GetValues(typeof(Keys)))"
-- 			src += " gHook.HookedKeys.Add(key);"
-- 			src += "}"

Обаче, ако директно ги вмъкна в останалата част от кода излиза грешка: The name 'gHook' does not exist in the current context"

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 9 минути, A.com написа:

Ще трябва и тази част да се вмъкне, защото според мен тя зарежда всички клавиши чието натискане да се следи:

-- 			src += "public GlobalKeyboardHook gHook"
-- 			src += "private void Form1_Load(object sender, EventArgs e)"
-- 			src += "{"
-- 			src += " gHook = new GlobalKeyboardHook();"
-- 			src += " gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);"
-- 			src += "foreach (Keys key in Enum.GetValues(typeof(Keys)))"
-- 			src += " gHook.HookedKeys.Add(key);"
-- 			src += "}"

Обаче, ако директно ги вмъкна в останалата част от кода излиза грешка: The name 'gHook' does not exist in the current context"

 

GlobalKeyboardHook gHook

Това го тупни под другия глобал за мишката най горе

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 6 минути, petie1 написа:
GlobalKeyboardHook gHook

Това го тупни под другия глобал за мишката най горе

Имаш превдид под global MouseOps

Пак дава същата грешка. Трябва да си е вътре в С# кода или пък кода така да се промени, че да няма нужда от тоя gHook. :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 11 часа, A.com написа:

Тази част, която започва с тиретата трябва някакви да се вмъкне в кода над нея, така че да мога да използвам целия код без наличието на отделен диалогов прозорец с бутончета и текстово поле, в което да се показват натиснатите клавиши.

Все още не вдявам каква е целта на операцията. Първо мислех, че искаш да промениш въпросната програма. Сега мисля, че правиш кейлогър. Ако е второто ще е по-трудно, защото трябва повече да се рзбира езика на който си се спрял.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 часа, Melmak ® написа:

Все още не вдявам каква е целта на операцията. Първо мислех, че искаш да промениш въпросната програма. Сега мисля, че правиш кейлогър. Ако е второто ще е по-трудно, защото трябва повече да се рзбира езика на който си се спрял.

Трябва ми нещо като кийлогър, но не точно. Въпросната програма следи за натиснатите от потребителя клавиши на мишката и на клавиатурата, като няма значение коя друга програма е активна в момента. Перфектно е за разни презентации на софтуер, където се използват клавишни комбинации. Ето подобен софтуер: https://keypressosd.com/.

Ето и един, създаден с Autohotkey: http://www.dcmembers.com/skrommel/download/showoff/

Всички подобни програми са си вид кийлогъри, но за разлика от кийлогърите не изпращат информация някъде из нета(да се надяваме).

В интернет също така има доста примери за low level keyboard/mouse hook - прихващане на натиснатите от потребителя клавиши/бутони, за най-различни езици за програмиране(c++, C#, VB, dotNet, autohotkey и т.н.).

На мен ми трябва така нареченото on the fly assembly. Горният код, който съм дал, работи по следния начин:

Това

csharpProvider.CompileAssemblyFromSource compilerParams #(src)

компилира кода, който е записан като един цял стринг, и създава dll файл със случйно подбрано име(dj874rt5ohs.dll) в temp папка и след това този dj874rt5ohs.dll се зарежда в програмата, в която ще се използва. Това има следните предимства:

1- аз не използвам непроверен софтуер, доставян във вид на .dll файл и писан от друг човек. Съответно, ако го изпратя на други хора не се явявам разпространител на потенциално вредоносен софтуер.

2- знам какво точно прави този "кийлогър", кога ще работи, кога няма да работи

3- ако го изпратя на теб ти имаш свободата да разгледаш кода и да видиш крада ли информация, вредя ли ти по някакъв начин и т.н.

Проблемът е, че нямам никакви допирни точки с C# и това, което правя е да се ровя из интернет, да гледам другите какво са направили, да се опитам да разбера как работи техния код, да го сглобя и да тествам на мен дали ми върши работа или не. До тук резултата е 1000:0 в моя вреда. :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хм, значи искаш да е един вид като скрипт (четимо), но и да се интегрира на системно ниво. Затова си се спрял на C# и on the fly assembly. И затова искаш да го преправиш, да е на един файл.

Лошото е че и аз не го владея. Даже не ползвам Windows. Може би ще имаш повече късмет в раздела за програмиране.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 9 часа, Melmak ® написа:

Хм, значи искаш да е един вид като скрипт (четимо), но и да се интегрира на системно ниво. Затова си се спрял на C# и on the fly assembly. И затова искаш да го преправиш, да е на един файл.

Да.

Лошото е че и аз не го владея. Даже не ползвам Windows. Може би ще имаш повече късмет в раздела за програмиране.

Това не е ли разделът за програмиране?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 17 часа, A.com написа:

Това не е ли разделът за програмиране?

Прав си, аз съм се дезориентирал.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Добави ново...