الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

kbfiltr problem

بدأه ahmed dawod في 16 ديسمبر 2011 · 0 رد · 232 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1

انا دلوقتى بحاول اعمل برنامج بالC# يبعت keystrokes للويندوز بس الفكرة انى عاوزه يبعت hold key request

يعني الزرار يفضل مضغوط عليه لغاية ما انا اقوله release

دى انا جربت فيها كل حاجة

SendMessage, Keys.Send, .... etc

بس ما فيش فايدة كل اللى بيحصل ان الkey بيتبعت امر press بس و بيتضغط عليه مرة واحدة و خلاص

بعد كده من خلال البحث اكتشفت ان الدرايفر بتاع الكيبورد لما بيلاقي امر hold جاى من برنامج (مش من الزراير نفسها بتاعة الكيبورد) بيخليه امر press بس

و لقيت انى لازم اعمل حاجة اسمها keyboard filter

فنزلت ال Windows Driver Kit و سطبتها و فتحت كود الkbfiltr.c

و قلت اجربه الاول

فنزلت سامبل من منتدى للدالة اللى اسمها KbFilter_ServiceCallback و عملت build للتعريف و قلت اجرب كده

جيت اعرفه لقيته بيقولى system cannot find the file specified

ففتحت الملف kbfiltr.ini لقيت جواه reference على ملف اسمه keyboard.ini فدورت عليه لغاية مالقيته فى فولدر C:\Windows و جبته و خليته فى نفس فولدر التعريف

اشتغل و اتعرف فعلا التعريف الجديد للكيبورد و عملت ريستارت و جيت اجرب ما عملش حاجة

هو المفروض ان السامبل اللى انا جبته ده بيخلي اى حرف اكتبه يسبقه ب ضغطتين Shift + Alt

لقيته مش بيعمل اى حاجة و بيكتب عادى

ده الكود اللى انا جربته

VOID
KbFilter_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
{

    PDEVICE_EXTENSION   devExt;
	KEYBOARD_INPUT_DATA extra;
	//ULONG nTestConsumed;

	USHORT add_keycombo[2] = {0x036, 0x038};
	int Nkeys = 2;

	int i;



	// try to switch on(/off) the key pairs.
	for ( i = 0; i < Nkeys; i ++ )
	{
		extra.UnitId = InputDataStart->UnitId;
		extra.MakeCode = add_keycombo | (InputDataStart->MakeCode & 0x080);		//switch-on (or off )
			//InputDataStart->MakeCode + i + 1; (test input)
		extra.Flags = InputDataStart->Flags;
		extra.Reserved = InputDataStart->Reserved;
		extra.ExtraInformation = InputDataStart->ExtraInformation;

		devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

		(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(
			devExt->UpperConnectData.ClassDeviceObject,
			&extra,
			&extra + 1,	// just add 1 byte
			InputDataConsumed);
	}

	//InputDataStart->MakeCode = (USHORT)(InputDataEnd - InputDataStart) + 1;
	// this returns "2".

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

	(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(
		devExt->UpperConnectData.ClassDeviceObject,
		InputDataStart,
		InputDataEnd,
		InputDataConsumed);

}

فعملت طبعا Roll Back عشان ارجع التعريف القديم للكيبورد

حد يعرف حل للمشكلة دى ؟

1

مواضيع مشابهة