Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« : 16-01-2007 20:03 » |
|
Добрый день/вечер. Недавно заинтересовался (точнее меня заинтересовали ) следующей задачей. У компа есть обыкновенная мышь (не обязательно USB). И есть USB-трекбол(по сути - та же мышь). Надо: Чтобы "обыкновенная мышь" работала как обычно. Трекбол работал только с моим приложением, грубо говоря, чтобы при изменении "положения" трекбола обычный курсор не двигался, а мое приложение получало об это соответствующее уведомление. Как правильней реализовать такое? С уважением, Артем.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 18-01-2007 09:47 » |
|
задачка интересная... сам о таком думал) судя по тому как работают две мыши по умолчанию... те перемещения которые они обе отслеживают скопом валятся на координаты указателя. те "дельты" координат формируются драйверами мыши... а интерфейс у них HID. так что видимо, можно написать драйвер-фильтр, подстыковать его где нибудь "между"... а может и напрямую из приложения можно к HID драйверу трекбола подключится) надо читать DDK и экскрементировать)
ничего шибко-конкретно-умного я с налета не предложил конечно, но сам бы пошел по такому пути... плюс рекомендую посерчить в инете, наверняка что нибудь найдется - идея то в воздухе витает...)) а вообще меня уже месяц как интерисует тот же вопрос... использовать трекбол в качестве ээ... типа ручки громкости и настройки... только вот пока не уверен на 100%, что это будет удобно...
PS ща мельком глянул DDK.... Mouclass Device Control Requests (IRP_MJ_DEVICE_CONTROL (Mouclass)) - может быть?
|
|
« Последнее редактирование: 18-01-2007 09:51 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #2 : 18-01-2007 10:37 » |
|
Благодарю за ответ.
Мне тоже кажеться, что необходимо подстыковать фильтр, в котором все пакеты от обычной мыши посылать дальше, а от трекбола-- только конкретному приложению.
В выходные еще "покопаю".
|
|
|
Записан
|
|
|
|
GreyAngel
Гость
|
|
« Ответ #3 : 22-01-2007 04:20 » |
|
|
|
« Последнее редактирование: 22-01-2007 04:23 от GreyAngel »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #4 : 22-01-2007 07:34 » |
|
GreyAngel, сенькс!!!! будем копать!
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #5 : 28-01-2007 11:38 » |
|
GreyAngel, спасибо большое! как раз то что я и искал!!! Причем, там решены проблемы, на которые я уже морально настроился потратить "кучу" времени!!! С уважением, Артем
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 02-08-2007 13:26 » |
|
кстати, тоже подключил cpnmouse - весч! только не захотел hapi.c использовать. решил lapi.c обойтись и.... пол дня только проковырялся пока понял, что APC должны в отдельную нить приходить) из за того что, они именно что APC) то есть, нить сама не пробудится! в hapi для этого используется нить с ожиданием события и флагом!!! что выход из WaitForSingleObject() по APC тоже возможен. кроме того - добавли строчку в драйвер, для возможности отлеживания колесика. b = (void *)(unsigned int)((i->ButtonFlags << 16) | (((unsigned int) i->ButtonData) & 0xffff));
вместо того, что было: b = (void *)(unsigned int)((i->ButtonFlags << 16);
тогда в lapi.c: void __cdecl ApcCallback(PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2) { if (theCallback!=NULL) { while (WaitForSingleObject(hMutex, INFINITE) != WAIT_OBJECT_0) ; theCallback( (((int) NormalContext)-1), (signed int) (signed short int) ((((unsigned int) SystemArgument1) & 0xffff0000) >> 16), (signed int) (signed short int) (((unsigned int ) SystemArgument1) & 0xffff), (unsigned int) ((((unsigned int) SystemArgument2) & 0xffff0000) >> 16), (int) (((unsigned int) SystemArgument2) & 0xffff));
ReleaseMutex(hMutex); } }
а пользовательская будет void __cdecl thehCallback(int number, signed int dx, signed int dy, unsigned int buttons, signed int weel) { switch (buttons) { case 0x1: //нажатие лево break; case 0x2: //отжатие лево break; case 0x4: //нажатие право break; case 0x8: //отжатие право break; case 0x10: //нажатие середина break; case 0x20: //отжатие середина break; case 0x40: //кнопка 4 нажатие break; case 0x80: //кнопка 4 отжатие break; case 0x100: //кнопка 5 нажатие break; case 0x200: //кнопка 5 отжатие break; case 0x400: //колесо //параметры: //up : weel==0x0078 >0 ??? //down : weel==0xFF88 <0 ??? break; default: break; }
PS как раз тоже прикупил трекбол логитековский "Marble") привязал его к своему приложению. да, код - для случая если режим Suspend не нужен. так по идее лучше еще один параметр для пользовательского callback-а сделать.
|
|
« Последнее редактирование: 02-08-2007 13:34 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #7 : 11-11-2014 07:41 » |
|
Добрый день. Cpnmouse очень хорошая вещь, которая активно используется у нашей системе наведения для антенн. Антенна движется вслед за вращением трекбола. Все бы хорошо, но работает это дело только под 32-битной Windows. А давече пришли компьютеры с предустановленной Windows x64. И переустановить ОС не представляется возможным, поэтому руководство поставило задачу выполнить пятилетку в три года, то есть заставить cpnmouse tools работать под Windows x64. С помощью Windows Driver Kits я собрал sys-файл из исходников. Inf-файл переписал следующим образом: ; Installation file (.inf) for the CPN Tools mouse filter driver ; ; (c) Copyright 2002-2004 CPN Group, University of Aarhus ;
[Version] Signature="$Windows NT$" Provider=%CPNGroup% ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318} Class=Mouse CatalogFile=cpnmouse.cat DriverVer=09/05/2004,1.0.5.0
[DestinationDirs] DefaultDestDir = 12
; ; Driver information ;
[Manufacturer] %CPNGroup% = CPNGroup.Mfg, NTamd64
[CPNGroup.Mfg] %CPNGroup.DeviceDesc0% = ps2inst, *PNP0FAKE %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c402 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c000 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c001 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c00e %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c016 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_0603&PID_6871 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_061c&PID_a700 %CPNGroup.DeviceDesc2% = serinst, *PNP0F0C,SERENUM\PNP0F0C,SERIAL_MOUSE
[CPNGroup.Mfg.NTamd64] %CPNGroup.DeviceDesc0% = ps2inst, *PNP0FAKE %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c402 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c000 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c001 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c00e %CPNGroup.DeviceDesc1% = usbinst, HID\VID_046d&PID_c016 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_0603&PID_6871 %CPNGroup.DeviceDesc1% = usbinst, HID\VID_061c&PID_a700 %CPNGroup.DeviceDesc2% = serinst, *PNP0F0C,SERENUM\PNP0F0C,SERIAL_MOUSE
; ; General installation section ;
[ps2inst] ; perform port related actions from msmouse.inf Include=msmouse.inf Needs=Ps2_Inst
AddReg=cpnmouse.AddReg ; Copy the driver over CopyFiles=cpnmouse.CopyFiles
[usbinst] ; perform port related actions from msmouse.inf Include=msmouse.inf Needs=HID_Mouse_Inst.NT
AddReg=cpnmouse.AddReg ; Copy the driver over CopyFiles=cpnmouse.CopyFiles
[serinst] ; perform port related actions from msmouse.inf Include=msmouse.inf Needs=Ser_Inst
AddReg=cpnmouse.AddReg ; Copy the driver over CopyFiles=cpnmouse.CopyFiles
[cpnmouse.AddReg]
; ; File sections ;
[cpnmouse.CopyFiles] cpnmouse.sys
; ; Service Installation ;
[ps2inst.Services] AddService = cpnmouse, , cpnmouse_Service_Inst, cpnmouse_EventLog_Inst ; Install the port driver and mouclass from msmouse.inf Include=msmouse.inf Needs=Ps2_Inst.Services
[usbinst.Services] AddService = cpnmouse, , cpnmouse_Service_Inst, cpnmouse_EventLog_Inst ; Install the port driver and mouclass from msmouse.inf Include=msmouse.inf Needs=HID_Mouse_Inst.NT.Services
[serinst.Services] AddService = cpnmouse, , cpnmouse_Service_Inst, cpnmouse_EventLog_Inst ; Install the port driver and mouclass from msmouse.inf Include=msmouse.inf Needs=Ser_Inst.Services
[cpnmouse_Service_Inst] ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 0 ; SERVICE_ERROR_IGNORE LoadOrderGroup = Pointer Port ServiceBinary = %12%\cpnmouse.sys
[cpnmouse_EventLog_Inst] AddReg = cpnmouse_EventLog_AddReg
[cpnmouse_EventLog_AddReg] HKR,,EventMessageFile,0x00020000,"%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\drivers\cpnmouse.sys" HKR,,TypesSupported,0x00010001,7
[ps2inst.HW] ; Add the device upper filter AddReg = ps2inst.HW.AddReg
; run the directives need by the port driver Include=msmouse.inf Needs=Ps2_Inst.HW
[usbinst.HW] ; Add the device upper filter AddReg = usbinst.HW.AddReg
; run the directives need by the port driver Include=msmouse.inf Needs=HID_Mouse_Inst.NT.HW
[serinst.HW] ; Add the device upper filter AddReg = serinst.HW.AddReg
; run the directives need by the port driver Include=msmouse.inf Needs=Ser_Inst.HW
[ps2inst.HW.AddReg] HKR,,"UpperFilters",0x00010000,"cpnmouse"
[usbinst.HW.AddReg] HKR,,"UpperFilters",0x00010000,"cpnmouse"
[serinst.HW.AddReg] HKR,,"UpperFilters",0x00010000,"cpnmouse"
; ; Source file information ;
[SourceDisksNames.x86] 1 = %DiskId1%,,,""
[SourceDisksNames.ntamd64] 1 = %DiskId1%,,,""
[SourceDisksFiles] ; Files for disk CPN Group, University of Aarhus Installation Disk #1 (Mouse) cpnmouse.sys = 1,,
[Strings]
; ; Non-Localizable Strings ;
REG_SZ = 0x00000000 REG_MULTI_SZ = 0x00010000 REG_EXPAND_SZ = 0x00020000 REG_BINARY = 0x00000001 REG_DWORD = 0x00010001 SERVICEROOT = "System\CurrentControlSet\Services"
; ; Localizable Strings ;
CPNGroup.DeviceDesc0 = "CPN Tools mouse filter driver PS/2" CPNGroup.DeviceDesc1 = "CPN Tools mouse filter driver USB" CPNGroup.DeviceDesc2 = "CPN Tools mouse filter driver serial" DiskId1 = "CPN Group, University of Aarhus Installation Disk #1 (Mouse)" CPNGroup = "CPN Group, University of Aarhus"
В принципе, драйвер устанавливается, хоть и ругается на цифровую подпись. Но с ней проблему решить труда не составляет. Интересует меня другое в проекте cpnmouse есть библиотека, которая как я понял и работает с этим драйвером, а также программы demo и ordinary, показывающие работу всего этого дела. Когда я пересобрал весь проект, то обе программы запускаются и даже определяют, что в системе есть одно указывающее устройство с драйвером cpnmouse. Но стоит только этой мышкой/трекболом подвигать или щелкнуть кнопкой как вылетает исключение (на рисунке во вложении). Подскажите, пожалуйста, в чем проблема. Из-за несоответствия того, что драйвер теперь 64-битный, а библиотека cpnmouse-lib и приложения 32-битные? Или в чем-то другом? Большое спасибо.
|
|
|
Записан
|
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #8 : 11-11-2014 08:51 » |
|
Еще добавлю. Попробовал для солюшна выставить сборку х64 в Configuration Manager, но все равно вылетает с исключением при попытке подвигать трекболом. Visual Studio при исключении тыкает мне на WaitForSingleObjectEx в функции "DWORD WINAPI MainThread(LPVOID lpParameter)" в файле hapi.c.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 11-11-2014 09:56 » |
|
сейчас повспоминал немного как оно работало...скорее всего да. там при регистрации обработчика ApcCallback приложения - открывается драйвер по IRP_MJ_CREATE с именем, которое формируется в том числе из адреса APC процедуры обработки: sprintf(c, "%s\\execute\\get\\%u\\%Iu", functionClassDeviceData->DevicePath, maxused + 1, &ApcCallback); а в драйвере при разборе этот адрес разбирается как int и записывается в поле адреса калбэка: devExt->routine = (PKNORMAL_ROUTINE) readInt(token);
потом в драйвере, при необходимости передать параметры, ставится в очередь APC: KeInitializeApc(apc, devExt->client, 0, (PKKERNEL_ROUTINE) &KeAPCRoutine, 0, devExt->routine, UserMode, (PVOID) devExt->id); KeInsertQueueApc(apc, p, b, 0);
а вот тут не знаю как поведет себя эта функция. она похоже немного недокументирована((( хотя с первого взгляда совсем криминала не вижу. параметры, (которые на самом деле указатели) формируются в драйвере: p = (void *)(unsigned int)((i->LastX << 16) | (((unsigned int) i->LastY) & 0xffff)); b = (void *)(unsigned int)((i->ButtonFlags << 16) | (((unsigned int) i->ButtonData) & 0xffff));
тут вроде тоже не криминал... но опять же не понятно как оно транслироваться будет в 32 разрядный код. попробуйте скомпилить отладочную версию драйвера, и посмотреть отладочные сообщения драйвера при тыканье кнопок. (какой нить DebugView к примеру. только вывод ядровых отладочных сообщений там в реестре надо включить где-то) Добавлено через 1 минуту и 11 секунд:и скиньте сюда лог)
|
|
« Последнее редактирование: 11-11-2014 09:57 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #10 : 11-11-2014 10:20 » |
|
Спасибо Вам большое за столь оперативный ответ. Лог вот: 00000001 0.00000000 Debug info 00000002 0.00000601 --- 0 0 9040b60 12ed89d 1 --- 00000003 0.02399595 Debug info 00000004 0.02400165 --- 10000 0 9040b60 12ed89d 1 --- 00000005 0.03199590 Debug info 00000006 0.03200160 --- 40000 0 9040b60 12ed89d 1 --- 00000007 0.03999164 Debug info 00000008 0.03999735 --- 70000 0 9040b60 12ed89d 1 --- 00000009 0.04799549 Debug info 00000010 0.04800150 --- 70000 0 9040b60 12ed89d 1 --- 00000011 0.05599514 Debug info 00000012 0.05600085 --- 70001 0 9040b60 12ed89d 1 --- 00000013 0.06399179 Debug info 00000014 0.06399749 --- 70002 0 9040b60 12ed89d 1 --- 00000015 0.07199444 Debug info 00000016 0.07200015 --- 70001 0 9040b60 12ed89d 1 --- 00000017 0.07999439 Debug info 00000018 0.08000010 --- 90002 0 9040b60 12ed89d 1 --- 00000019 0.08799434 Debug info 00000020 0.08800034 --- 70003 0 9040b60 12ed89d 1 --- 00000021 0.09600270 Debug info 00000022 0.09600870 --- 80002 0 9040b60 12ed89d 1 --- 00000023 0.10399394 Debug info 00000024 0.10399994 --- 70003 0 9040b60 12ed89d 1 --- 00000025 0.11199389 Debug info 00000026 0.11199959 --- 60004 0 9040b60 12ed89d 1 --- 00000027 0.11999414 Debug info 00000028 0.11999984 --- 50002 0 9040b60 12ed89d 1 --- 00000029 0.12799318 Debug info 00000030 0.12799889 --- 50002 0 9040b60 12ed89d 1 --- 00000031 0.13599344 Debug info 00000032 0.13599914 --- 30002 0 9040b60 12ed89d 1 --- 00000033 0.14399369 Debug info 00000034 0.14399970 --- 50001 0 9040b60 12ed89d 1 --- 00000035 0.15199304 Debug info 00000036 0.15199874 --- 20001 0 9040b60 12ed89d 1 --- 00000037 0.15997496 Debug info 00000038 0.15998067 --- 20000 0 9040b60 12ed89d 1 --- 00000039 0.16797101 Debug info 00000040 0.16797642 --- 10000 0 9040b60 12ed89d 1 --- 00000041 0.17597276 Debug info 00000042 0.17597817 --- 10000 0 9040b60 12ed89d 1 --- 00000043 0.30399299 Debug info 00000044 0.30399868 --- 0 0 9040b60 12ed89d 1 --- 00000045 0.31198934 Debug info 00000046 0.31199533 --- 10000 0 9040b60 12ed89d 1 --- 00000047 0.31998956 Debug info 00000048 0.31999528 --- 0 0 9040b60 12ed89d 1 --- 00000049 4.21590424 Debug info 00000050 4.21591043 --- 0 10000 9040b60 12ed89d 1 --- 00000051 4.63189316 Debug info 00000052 4.63189888 --- 0 20000 9040b60 12ed89d 1 --- 00000053 5.27187586 Debug info 00000054 5.27188158 --- 0 40000 9040b60 12ed89d 1 --- 00000055 5.71187019 Debug info 00000056 5.71187687 --- 0 80000 9040b60 12ed89d 1 --- 00000057 6.19985771 Debug info 00000058 6.19986391 --- 0 0 9040b60 12ed89d 1 --- 00000059 6.74384356 Debug info 00000060 6.74384928 --- 0 0 9040b60 12ed89d 1 --- 00000061 7.30382872 Debug info 00000062 7.30383396 --- 0 0 9040b60 12ed89d 1 --- 00000063 7.80780792 Debug info 00000064 7.80781364 --- 0 0 9040b60 12ed89d 1 ---
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 11-11-2014 10:39 » |
|
параллельно запустите проект под отладчиком. расшифровка лога такая p = (void *)(unsigned int)((i->LastX << 16) | (((unsigned int) i->LastY) & 0xffff)); b = (void *)(unsigned int)((i->ButtonFlags << 16) | (((unsigned int) i->ButtonData) & 0xffff)); devExt->id = readInt(token); - НОМЕР МЫШКИ вроде<<<<<<<<<<<<<<<<< devExt->client = KeGetCurrentThread(); <<<<<<<<<<ID нити из которого вызывалось devExt->routine = (PKNORMAL_ROUTINE) readInt(token); <<<<< адрес APC. DebugPrint("--- %x %x %x %x %x ---", p, b, devExt->client, devExt->routine, devExt->id); проверьте на соответствие адрес в отладочном сообщении и адрес в отладчике функции ApcCallback в "lapi.c" Добавлено через 54 секунды:вообще в отладчике брякпоинт на ApcCallback срабоает?
|
|
« Последнее редактирование: 11-11-2014 10:40 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #12 : 11-11-2014 11:57 » |
|
Брекпоинт ставится и даже съедается Студией, но при выполнении программы я туда ни разу не попал В MainThread на WaitForSingleObjectEx вывалился.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 11-11-2014 13:01 » |
|
то что валится на WFSO - это как раз момент когда APC доходит до процесса, но видимо не исполняется. попробуйте в драйвере использовать PsWrapApcWow64ThreadNTSTATUS PsWrapApcWow64Thread( __inout PVOID *ApcContext, __inout PVOID *ApcRoutine)
/*++
Routine Description:
This routine is used by kernel mode callers to queue APCs to a 32-bit thread running inside a Wow64 process. It wraps the original APC routine with a wrapper routine inside Wow64. The target Apc routine must be inside 32-bit code. This routine must be executed in the context of the Wow64 thread where the target APC is going to run in. The resulting ApcContext and ApcRoutine from this routine are used when initializing, using KeInitializeApc, to be queued later to a Wow64 thread. The API does nothing and succeeds on : - 32-bit systems. - native 64-bit processes on 64-bit systems.
Environment:
Kernel mode only.
Arguments:
ApcContext - Pointer to the original ApcContext parameter.
ApcRoutine - Pointer to the original ApcRoutine that is targeted to run 32-bit code.
Return:
NTSTATUS.
--*/ пишут что может помочь. подробности тут: предлагают вот такую обертку void APCKernelRoutine // отдать в KeInitializeApc() как PKKERNEL_ROUTINE в случае если твой целевой процесс 32 бита ( KAPC* apc , PKNORMAL_ROUTINE* pf_norm , void** pnorm_ctx , void** psys_ctx1 , void** psys_ctx2 ) { ... PsWrapApcWow64Thread(pnorm_ctx, pfnorm); ... } + не забыть про " #ifdef _AMD64_ и проверку IoIs32bitProcess(), и делать это всё следует в kernel APC routine." PS товарищу x64 очередное спасибо)
|
|
« Последнее редактирование: 11-11-2014 13:05 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #14 : 11-11-2014 13:15 » |
|
PPS еще вот какая штука объявилась.. пока не вкурил что это MultiPoint Mouse SDK
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #15 : 11-11-2014 13:53 » |
|
Я уже пробовал ставить Multipoint SDK. Довольно интересная вещь, специально созданная для многомышевых систем. Но там используется C#, а я неуч и не знаю, можно ли это как-то прикрутить к гигантскому С++ проекту.
|
|
|
Записан
|
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #16 : 11-11-2014 14:14 » |
|
Ну все, все заработало. Сделал так, как вы сказали. Спасибо Вам большое. Теперь операторы на Байконуре будут и дальше гонять антенны с помощью трекбола
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #17 : 11-11-2014 14:37 » |
|
ага, круто) кстати в хелпе по Multipoint SDK указан и с++) а эксцепшен 2 откуда?)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
TazmanianDevil
Интересующийся
Offline
|
|
« Ответ #18 : 11-11-2014 18:37 » |
|
На будущее тогда можно будет посмотреть и в сторону Multipoint SDK А exception2 возникает при запуске cpnmouse-demo или cpnmouse-ordinary. Проявляется очень хитро. Если совершать короткие движения трекболом, то все работает как часы. Но если долго и упорно вести курсор, то вываливается с сообщением о переполнении стека. Что самое интересное в нашей программе такого нет. Причину пока не нашел.
|
|
|
Записан
|
|
|
|
|