Windows 7 - Turn off mouse pointer when no mouse is plugged in

Asked By Smedly Tonker on 30-Jan-08 10:16 AM
Background:

My company builds an XPE product with a touch screen for pointer input & so
we usually don't want a mouse pointer displayed. Even though our product is
not fielded with a mouse I still wanted the capability to plug in a mouse
for testing, development, etc.  So I searched the internet for a registry
setting or a utility that would hide the mouse pointer when no mouse was
plugged in and cause it to reappear once a mouse is plugged in.
Unfortunately I didn't find a utility that did this. So I built my own.



How my program works:

My program compiles to 6Kb (as long as you link to DLL runtime library and
you use the following linker option: /OPT:NOWIN98). My program also relies
on a free third party application that I found on the internet called
'nomousy.exe' (13Kb) which allows you to hide the mouse cursor. My program
determines when a USB mouse is plugged in or not and then calls 'nomousy.exe'
to hide or show the mouse cursor. Note that my program only recognizes when
a USB mouse is plugged in (although you could easily fix this). This is
because we don't have PS/2 connector on our device.



So if anyone now or in the future has a need for such a utility I have
provided the source code to my program below:






BOOL bMousedPluggedIn = FALSE;



BOOL FindProcess(TCHAR* _szName)

{

try

{

char      szName[MAX_PATH], szToTermUpper[MAX_PATH];

int       iLen, iLenP, indx;

BOOL      bResult;

DWORD     aiPID[1000], iCb = 1000, iNumProc, iV2000 = 0;

DWORD     iCbneeded, i;

HANDLE    hProc;

HINSTANCE hInstLib;

HMODULE   hMod;



if((_szName == NULL))

return FALSE;



if((*_szName == NULL))

return FALSE;



// Transfer Process name into "szToTermUpper" and

// convert it to upper case

iLenP = strlen(_szName);

if((iLenP < 1) || (iLenP > MAX_PATH))

return FALSE;



for(indx=0; indx < iLenP; indx++)

szToTermUpper[indx] = toupper(_szName[indx]);



szToTermUpper[iLenP] = 0;



// PSAPI Function Pointers.

BOOL (WINAPI *lpfEnumProcesses)( DWORD*, DWORD cb, DWORD*);

BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE*, DWORD,
LPDWORD );

DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE, LPTSTR,
DWORD );



if((hInstLib = LoadLibraryA("PSAPI.DLL")) == NULL)

return FALSE;



// Get procedure addresses.

lpfEnumProcesses      = (BOOL  (WINAPI*)(DWORD*, DWORD,    DWORD*))
GetProcAddress(hInstLib, "EnumProcesses");

lpfEnumProcessModules = (BOOL  (WINAPI*)(HANDLE, HMODULE*, DWORD,
LPDWORD)) GetProcAddress(hInstLib, "EnumProcessModules");

lpfGetModuleBaseName  = (DWORD (WINAPI*)(HANDLE, HMODULE,  LPTSTR,
DWORD ))  GetProcAddress(hInstLib, "GetModuleBaseNameA");



if((lpfEnumProcesses == NULL) || (lpfEnumProcessModules == NULL) ||
(lpfGetModuleBaseName == NULL))

{

FreeLibrary(hInstLib);

return FALSE;

}



bResult = lpfEnumProcesses(aiPID, iCb, &iCbneeded);

if(!bResult)

{

// Unable to get process list, EnumProcesses failed

FreeLibrary(hInstLib);

return FALSE;

}



// How many processes are there?

iNumProc = iCbneeded / sizeof(DWORD);



// Get and match the name of each process

for(i = 0; i < iNumProc; i++)

{

// Get the (module) name for this process

strcpy(szName, "Unknown");



// First, get a handle to the process

hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, aiPID[i]);



// Now, get the process name

if(hProc)

if(lpfEnumProcessModules(hProc, &hMod, sizeof(hMod),
&iCbneeded))

iLen = lpfGetModuleBaseName(hProc, hMod, szName, MAX_PATH);



CloseHandle(hProc);



// We will match regardless of lower or upper case

if(stricmp(szName, szToTermUpper) == 0)

{

FreeLibrary(hInstLib);

return TRUE;

}

}



FreeLibrary(hInstLib);

}

catch(...)

{


OutputDebugString("Uncaught exception!! - FindProcess");


}




return FALSE;

}



void Execute(LPCTSTR lpszApp, LPCTSTR lpszArgs)

{

SHELLEXECUTEINFO sei;

TCHAR            szPath[MAX_PATH];

TCHAR*           pStrPos;



lstrcpy(szPath, lpszApp);

if((pStrPos = _tcsrchr(szPath, '\\')))

*pStrPos = NULL;

else

*szPath = NULL;



memset(&sei, 0, sizeof(sei));

sei.cbSize       = sizeof(sei);

sei.fMask        = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;

sei.hwnd         = NULL;

sei.lpFile       = lpszApp;

sei.lpParameters = lpszArgs;

sei.lpDirectory  = szPath;

sei.nShow        = SW_HIDE;



ShellExecuteEx(&sei);

}



void MousePointer()

{

static TCHAR szNoMousyExe[] = "nomousy.exe";

static BOOL  bFirst         = TRUE;

static BOOL  bNoMousy       = FALSE;



if(bFirst)

{

TCHAR  szFilename[MAX_PATH] = {0};

TCHAR  szPath[MAX_PATH]     = {0};

TCHAR* pStrPos;



if(GetModuleFileName(NULL, szPath, MAX_PATH))

if((pStrPos = _tcsrchr(szPath, '\\')))

*pStrPos = NULL;



wsprintf(szFilename, TEXT("%s\\%s"), szPath, szNoMousyExe);

if((GetFileAttributes(szFilename) != 0xFFFFFFFF))

bNoMousy = TRUE;



bFirst = FALSE;

}



if(bNoMousy)

{

static BOOL bSync   = FALSE;

static BOOL bHidden = FALSE;



if(!bSync)

{

if(FindProcess(szNoMousyExe))

bHidden = TRUE;



bSync = TRUE;

}



if(bMousedPluggedIn)

{

// mouse present

if(bHidden)

{

Execute(szNoMousyExe, NULL);

bHidden = FALSE;

}

}

else

{

// mouse not present

if(!bHidden)

{

Execute(szNoMousyExe, TEXT("/hide"));

bHidden = TRUE;

}

}

}

}



char FirstDriveFromMask (ULONG unitmask)

{

char i;



for (i = 0; i < 26; ++i)

{

if(unitmask & 0x1)

break;



unitmask = unitmask >> 1;

}



return (i + 'A');

}



void Main_OnDeviceChange(HWND hwnd, WPARAM wParam, LPARAM lParam)

{

char               szMsg[128] = {0};

PDEV_BROADCAST_HDR lpdb       = (PDEV_BROADCAST_HDR) lParam;



switch(wParam)

{

case DBT_DEVICEARRIVAL:

switch(lpdb->dbch_devicetype)

{

case DBT_DEVTYP_DEVICEINTERFACE:

{

bMousedPluggedIn = TRUE;

MousePointer();

}

break;

}

break;



case DBT_DEVICEREMOVECOMPLETE:

switch(lpdb->dbch_devicetype)

{

case DBT_DEVTYP_DEVICEINTERFACE:

{

bMousedPluggedIn = FALSE;

MousePointer();

}

break;

}

break;



default:

break;

}

}



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)

{

switch (message)

{

case WM_DESTROY:

PostQuitMessage(0);

break;



case WM_DEVICECHANGE:

Main_OnDeviceChange(hWnd, wParam, lParam);

break;



default:

return DefWindowProc(hWnd, message, wParam, lParam);

}



return 0;

}



BOOL RegisterForUSBDeviceNotify(HWND hWnd)

{

GUID                          InterfaceClassGuid = {0x378de44c, 0x56ef,
0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd};
//GUID_DEVINTERFACE_MOUSE

HDEVNOTIFY                    hDevNotify         = {0};

DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = {0};



NotificationFilter.dbcc_size       =
sizeof(DEV_BROADCAST_DEVICEINTERFACE);

NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

memcpy(&NotificationFilter.dbcc_classguid, &InterfaceClassGuid,
sizeof(GUID));



hDevNotify = RegisterDeviceNotification(hWnd, &NotificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE);



if(!hDevNotify)

return FALSE;



return TRUE;  // return TRUE  unless you set the focus to a control

}



BOOL FigureOutIfMouseIsConnected()

{

GUID     InterfaceClassGuid = {0x378de44c, 0x56ef, 0x11d1, 0xbc, 0x8c,
0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd}; //GUID_DEVINTERFACE_MOUSE

HDEVINFO hDevInfo           = INVALID_HANDLE_VALUE;

BOOL     ret                = FALSE;



// Create a HDEVINFO with all present devices.

if(((hDevInfo = SetupDiGetClassDevs(&InterfaceClassGuid, 0, 0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) != INVALID_HANDLE_VALUE))

{

DWORD           i;

SP_DEVINFO_DATA DeviceInfoData = {0};



// Enumerate through all devices in Set.

DeviceInfoData.cbSize  = sizeof(DeviceInfoData);



for(i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)

{

DWORD buffersize;

DWORD DataT      = 0;



/*       char szData[1024] = {0};

buffersize = (sizeof(szData) - 1);



if(!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData,
SPDRP_DEVICEDESC, &DataT, (PBYTE) szData, buffersize, &buffersize))

break;



char szDbg[1024 + 128];

sprintf(szDbg, "Result:[%s]\r\n", szData);

OutputDebugString(szDbg);



*/

DWORD devCap = 0;

buffersize = sizeof(devCap);



if(!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData,
SPDRP_CAPABILITIES, &DataT, (PBYTE) &devCap, buffersize, &buffersize))

break;



// Eliminates terminal services mouse

if((devCap & CM_DEVCAP_SURPRISEREMOVALOK))

ret = TRUE;

}



//  Cleanup

SetupDiDestroyDeviceInfoList(hDevInfo);

}



return ret;

}



ATOM MyRegisterClass(HINSTANCE hInstance, LPCTSTR szClassName)

{

WNDCLASSEX wcex = {0};



wcex.cbSize         = sizeof(WNDCLASSEX);

wcex.style          = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc    = (WNDPROC)WndProc;

wcex.cbClsExtra     = 0;

wcex.cbWndExtra     = 0;

wcex.hInstance      = hInstance;

wcex.hIcon          = LoadIcon(hInstance, NULL);

wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);

wcex.lpszMenuName   = NULL;

wcex.lpszClassName  = szClassName;

wcex.hIconSm        = LoadIcon(wcex.hInstance, NULL);



return RegisterClassEx(&wcex);

}



BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND  hWnd           = NULL;

TCHAR szWindowName[] = TEXT("HidePtr");



MyRegisterClass(hInstance, szWindowName);

hWnd  = CreateWindow(szWindowName, szWindowName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);



if(!hWnd)

return FALSE;



ShowWindow(hWnd, SW_HIDE);

UpdateWindow(hWnd);

RegisterForUSBDeviceNotify(hWnd);

bMousedPluggedIn = FigureOutIfMouseIsConnected();

MousePointer();



return TRUE;

}



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)

{

MSG msg;



if(!InitInstance (hInstance, nCmdShow))

return FALSE;



while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}



return msg.wParam;

}




Smedly Tonker replied on 30-Jan-08 10:28 AM
In this message I'll attempt to attach my project - not sure if the
newgroup will allow attachments




begin 666 MousePtr.zip
M4$L#! H``````'9#/C@````````````````)````36]U<V50='(O4$L#!!0`
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
MJ *"X_R7K6>98_.J[_:G?<<[M-]3ON9?,R!N@B3>Q&E0XH=CFN//A!0T9WN
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
M;D9=YBNGHC.-*<;!2JHX;$5J3ZY?J(!S6 AS3K*RYW4(II' K)<''7)F9
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
M#Q3\_,A\6W)?:LV2Z#4XGDI+="NU!AV\7\GB.]I".56Q_K[ 91JSNRC/"
M$D!#G%71.[#<YSM#DRRIJ8W.?/V2T8:K7-TK'IS/>LWVBL__/N)GL8108_[9
MK<(<4J;[\$T,CF,DNU+Z$5D-80U H["._-,VMW/VLC>GEA7!C'!?6KJN[/J;
M:<4-5@JYT /-CX^DO$0X50ROQ;.:@HC@RTYTKO,=\2>A18-8'#X-5&@Y(J9!
M03-WR!E0>W$M&!*>!L7.W)N],\-[72<6CX\?>UWWY[A,+&VZ7\- (DRE<;),
M[2K:[[.^$F&/6]6&/K"$_VX07I& #M##@#R<44&2$630#(% D(R,S!,P-'*!
MRS:8F6N<3O>>] Z+8U)10#TH=Z6!_WI:@CHFJ-:QUN*8>!ZX_/.!UNL;^F\P
M7H YGC3X]V_\-0*@MW=6( W\1%=6`R"O8]@]\=Q L%(T6W9NC7MNOGP56IBE
MXZ3DX2YKSZU:EX:00@JL#XG%I/B[%F(Q34<+GMM5ZH\:6-!)T9)?Y%)!-Q$_
M'3N)'= RI<Y..=C:CB65I$1[D9<*-=!/`Q\34O3F->&?D"6]6XW*I2B'=HOD
M1#^M%,L2ZT+,8ULM119&V_)ZK==&;N9JGW,91!FYP%'8S..&BPT/O, =N',B
M5:=X._I\F$OHK^8M6[I>S? &!P=ORTW-S! _A%T0@H408<O-#X[-)^4)B6UD
M23B\M1O:#;M%RR!TWQ*878-?:ZIE74-<@]W*MM]1@QKI?0>[-(-_\OJYMH!2
M7[N[52!H/19F>:-5VGK7?*9>T*JO+2TP.T:7CK0*D+N#@X-5*M"\Y_ EI5_T
M<G3"9HSC!YG<$/L/6_!.;V&$I/K%5+T*":LD-$42O\I1<+> L9MG][3&"%:@
MYHA4+871//_=&;\K2*=%+Z-;OH6_C/":#:Q][#"!CLA"VYK4[U$!K@9X$TYE
M>OST:W"+:_8)(6N,NJ')\AD?WU8%8*P,ZJ:!*]61_:8CZ=8U?74H+[_=9KP;
MQR,F?(^/FBR]J31I3!_Q40)VIIGHI-=RXK/[JWSMN\K?4JN"E'*-@T5:AQ"6
M6+\5?[YE+CA6R9.O<7C\R[)Q7("S8T* HZ-'Q9<GL+-,T/K\,9/-=T(Z*+:7
M(N:!<Y49^* ^Z>(8,J309+_=JI)>REW.HW_&%%64'-V1'AX7R]V+5\9@<>_L
MBU-V!'Y/WN=O76Q_I8;QWKMBT((4AZOYOG??;_F^],"CR/#0XK9)=^31'1@_
MI/O::M>CK5)#N;RQ6]\@Z;:7_2XH-F4^!8@53.8=Z2;;5/L1J1 #ZGK@4+17
M?TEYK"P/7?8\8=,Y1I$GT7^\^DO6TI+?TG:/^!<2EX&!S^#N!^R:'7GY$:3<
MC 4V_N?5K+1-6PCA7^;?DJH3?/(Q%:MM="<OF7E[_M(B?0/7]0],!^<B)Q3C
MU9'>/KV)H9T%^A[9`<9T+B4AY;<SCL*(_1C9'+MV[/U$1K6FR9?^A\4_0)D,
M[>BFK1AR-/)7W,2&0I%@6_3-0?U.(U'/F_2M:%M..#A [U!<0\I>C-""^,;=
M?(OJ3TVH`6.=]=KMZR\YDLH#O\S9W@&[GS6B1V83*<:C(([MQ19.&VN7V*-"
M#_\"*WRZ?=_N>2((;%WMEFE<NZK!^9@-9?VY;8L^4O#"]7?9T5/[VQ>LK"YD
M>?IKMFY<>\]1F=M"O<W5&=$[UZ9IE7O%P_"0MXV$\"14;RMU9\BEBO-6@^XK
M.4P^0>R;]7N==S#HHLF5I<B_\VVF(@*7]OHAWPKT.N^*-^(@TZB__UC^`M/@
M)B'Y)ERFG[1@^IP%/''^0B;NR99_?SXY6+GZVOFC!LVRP6L/[FZJ8!X1^?TD
MJ/^,PJ>U[&B(NW_J/+)W4U2CQG-XZBT^)WT3XOHI5J>NT+(Q^?K)RT,].L^"
M<\CV)>>=[.R*6P^EV@';Z<%LAR,I^E/:-VP&AV\@D0PT&!8U>T_0;';*\JK_
MK7'C-M%GV)K$IT$L&;'?WR'R,%#5]T)XDQFB?'BNT*MT'E?3:#I)*TS9R[?/
MA01^MZ<SHUM0P:Y;6NF=/-RRJ"LW9"E!FF?_12"92:"(!:WPEFI1!V)?\+5-
M"P&5N9?WNYVJYJ]K2<$4W^FH[6Y$9H,_<V-/6SY=U/BR'M(HO?7Y=-*!H-.1
M:X1S7]8,N[5L83#@S' H16XDKA]IT(8P\&<T#*!:(YUO8<R0WR!3%CR2W3UZ
MC+"I_.\'_LV'*G_*U?[\G.9X?4@+"& M4TJ>3HL,PO\ZBG_X\^[JMW*#(3.D
M+HBAIY^/^"O4FKHC3^<:R,O@D;M\?9Z?7=9YF"+@L/XRS$=4A4\RG6.\(BJW
MIV'A0<Z;@N5>XH,Y&2[.P<*@)8C^./XZ!(E:!UOSBR^*\0>S=*DK2OXC^K)T
M#[3=K4'1T)LB18>_ZH0[+CTXL+=JZS^Z#;*QY:G^BX.>*T/N4Y.&@>!@/YMD
M^B>N1KQTLR^TE"UB>#DG"VCL"S:MOT+PSWAGPXJVKC-[L+3)=-Y!;_XN2Y9A
M//9&CIM-GOZT\7%,&C?1;;;E"#YGPZ)X$Z9M\@11*\V6U+TB1GH$+YL>RW%R
M&8X`=!H?2^L<R9BSQ*H'M8V*> QH)1 G<JA<:\ME+]!V0XEK@@:QUS?Z3<I[
M("L[0%=?GBEUGF,-ZI8(+(Y=%U#K)ITK]&13%J:L0/<3S.5_0YNIZXQB8%3)
M5N=?1BTD[$T)4L6E%(6<4/3PYN[ IAM>/G0(KU5>Q>[X>.AE"N5H'FEZTU!S
M0IH51?LZ@K=>E_-);]KL38<.:"EZ3(QP7!MM6+G-;<"XY\JIZ,/"(=N/6J_L
M+HQA`EX\)15_+AYT^65W`*2_["/DFC)S_+E<CZ^;Y8]Q$P:GZB&5B>-0'Z'^
ME!)#+7@IU^8;H*P-B/=W2I]A,FBC?<O.+X_U<=V()G(_\CK&QD9X]IK>8*B=
MAWNRIBV:M0DZ%&FK.1+8+8PTKNKR6$$K'R<:R-=PBT)AM*STAW\JC*^'N8V
MQ_RW0OU*-L;;EN2BW R,T0;RG@,FQ]>A=!%/> ZW'Y9R1-7)A!@=\-CDV)LG
M:.7?8S+47<;"DIYX*</')/#MNYOE2W^!A@NP7E;%R *$UX8B4%3$CO]IUTJC
MFKJV\'<O"0F3@C.B- XX4(H(%'$J00:E(O,@#M5 `J2$W#0W87",HE:D6%JK
MMJ)/7VM]M'6V:BM"<*ZBM<.SA8:*]-DJ3ECTB<APWTF:B@A9KO[K>LN/M<\^
M>W_[.V??L^[]<X+C\JFO3F*NY^ZW]J"K3^2U&"K/_7 ZVL7>X/1"CI.-TH;[
M?GEHUHL>VQL^&[?$UD<\3'W?8S'?;P;[SR$/]]^<;'A1.4B^7VPX-72N:JI-
MT3<-Z_T]W/HK14G?7NGI<F7+F +_?*_%[FQD$L6Y;1Z/72U[5K^D9/ 2*[&2
M"_8D*8O3Y2EV$C9;*:C/*BV6R=AL?C9KEZ(>EEQCMWZ+0*LZ)U$H>LSR:KK&
MLTJ72X?S7<ZW)9P6CJ%2U3+9@CX"1K9W0S_;,52@2M5BX RQFEB-7)F&1(E<
M@XB-\:I M9K)7=M6DQ4K=PN<+8B(M4X,41H.7'0(B4T4)L8Z!7FP[(/")883
M\@_"IL@DF<LD2BFF/*B]O"2(46H$"E%4+YEB3I!6S3(T8_=SZ;H%F8SV$O@I
MO;T1?N20H9V12,,R)6E*]%/[.(&.6")9649Y45YP'/&N0"R&CEP*.(MUMI0S
M[2S4D:'(FJ<[^*GW.#WX0=6CO*RIC?U+5JU:Q0\2S+,IL%O-K9IWU $]T-/-
M";W0&WW0=U@[U]^S/P; &0/A@D$8#%>\\.,.CELZ!$,Q#,/AAA$8B5$8#7>\
M"(^ ]L+!'WLB;"PR?."+E^'7KK_T<0O\]9B B9B$R7@%`2Z,PC^H:,I)!./7
MT"._%Y[&U.HZO(KI>S!C[I'[\T8A$E&(1HP0<3Y(N%1[8TP`9B()LWPQ!W/Q
MVL.MHM(VS ]8B$58C"58VEI[HT&P#,N1AQ5!6(4WL1KY6+.K_%),VENO8"W>
MWL01X!V\BW5X#^NQ`1OQ/C[ )A1C,[;@']B*;1S'Q)_Y$!]A.S[&#OP+)?@$
MG^*SDT;M3NS";NS!7NS#?AS YSB(0SB,+P@Y?>T1E.(HRE ./2IP#,=Q`B=Q
M"J=-^Y[!5SB+<ZC$>5S U[B(;_ MOL/W^#<NX0=3S8^H0C5^@@$U^!F748LK
MJ,,O^ ^NXE?\QG%C3N':G7K<P$W<PFW<00/NXG<TVAK5]W ?_\4#-.$AFO$(
M+6A%&]JYT-E5DZTP^.4W_:UZ]Y^)K\2[DF$]L,K]%UE 6O)AVYKE\KH,C&Q6
MPEVUC)Y<_ 9L'O(O_W15<PY9H'.0BP5O44G'>P?T+N*-1B_:WKJ/KZAY3\G0
M:#%&Q(J#-O,W":>*U/<;O:MY+KP)\6+^.N>\P;PA25$"?M$.N6>%W6#>AJ+
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
MH+ IJNUQ\J#Y$NH30&F)[8M H_'T5.]4K!B-XKIQG-@+@^?GK?Q();HHB]3
M3)45BKIG9_"HL@Q47DIM7L<3,LFXYO5;"6JYE$)Q@SL([B6>>Q+,0F(:\I<J
MJA(R7.T%QM]MU?]W#OT&4$L!`A0`"@``````=D,^. ````````````````D`
M```````````0`````````$UO=7-E4'1R+U!+`0(4`!0````(`&1#/CB\>5V"
M]PP``-,D```5````````````( ```"<```!-;W5S95!T<B]-;W5S95!T<BYC
M<'!02P$"% `4````" `+.#XXVW2*?) $``#1#P``%0```````````" ```!1
M#0``36]U<V50='(O36]U<V50='(N9'-P4$L!`A0`% ````@`^S4^.+3:$3;+
M````&P(``!4````````````@````%!(``$UO=7-E4'1R+TUO=7-E4'1R+F1S
M=U!+`0(4``H``````&]#/C@````````````````1````````````$ ```!(3
M``!-;W5S95!T<B]296QE87-E+U!+`0(4`!0````(`$8W/C@J;@!;W H````6
M```=````````````( ```$$3``!-;W5S95!T<B]296QE87-E+TUO=7-E4'1R
M+F5X95!+`0(4`!0````(`!L<33*ESJ4.UR(````R```<````````````( ``
M`%@>``!-;W5S95!T<B]296QE87-E+VYO;6]U<WDN97AE4$L!`A0`% ````@`
M^S4^.&L$W73"````)P$``!,````````````@````:4$``$UO=7-E4'1R+U-T
M9$%F>"YC<'!02P$"% `4````" "/-CXXRCFB?FP"``"!!0``$0``````````
M`" ```!<0@``36]U<V50='(O4W1D069X+FA02P4&``````D`"0!4`@``]T0`
`
end
Schocka replied on 01-Mar-08 09:53 PM
Hi There,

I am looking for help with my touch screen driver. I am trying to use the
touchscreen driver from Gunze, the zip files include inf, sys and exe files.
I followed the method described by Microsoft on how to create a custom
component. The component is getting built by target designer. The ufd.inf and
ufd.sys are included in the C:/windows directory. FBA runs fine, setupai.log
tells that the driver had been installed properly and the device did not
start for some unknown reason.

My question is should I see the Gunze driver on the Add/Remove programs list
? . If I install it manually, I see the application on the Add/Remove program
list. How come my application is not on the list ?.

Whats the normal procedure to add a third party component to XPE ?.

Thanks in advance,

SC
fillspibbom replied on 06-Oct-08 06:57 AM
Hi!
My name is Jessika!


--
fillspibbom
Posted via http://www.xpheads.com
JS replied on 09-Oct-08 02:04 PM
Another way to determine how many mice are plugged in is to call
GetRawInputDeviceList()
and count how many RIM_TYPEMOUSE devices are listed.