انا دلوقتى بحاول اعمل برنامج بال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 عشان ارجع التعريف القديم للكيبورد
حد يعرف حل للمشكلة دى ؟