DLL.CPP
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:10k
源码类别:

输入法编程

开发平台:

Visual C++

  1. // dll.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. #include "string.h"
  6. #include "stdio.h"
  7. #include "stdafx.h"
  8. #include "CMyWnd.h"
  9. #include "inputHwnd.h"
  10. #include "ConHwnd.h"
  11. #include "string.h"
  12. HINSTANCE savehInstDLL;
  13. #include "DllManager.h"
  14. DllManager ChLib;
  15. #define MYLIBAPI extern "C" __declspec(dllexport)
  16. MYLIBAPI int  SetShowString(long *fcmywnd,char*MindleStr,char*InputStr);
  17. MYLIBAPI long  GetSoftKbdWnd(long *fcmywnd);
  18. int MyMoveWin(CMyWnd *cmywnd,HWND hWnd ,long x,long y);
  19. BOOL GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg);
  20. BOOL WINAPI DllMain (
  21.  HINSTANCE    hInstDLL,
  22.  DWORD        dwFunction,
  23.  LPVOID       lpNot)
  24. {
  25.     switch(dwFunction)
  26.     {
  27. case DLL_PROCESS_ATTACH:
  28.        
  29. //MessageBox(0,0,0,0);
  30. savehInstDLL = hInstDLL;
  31. ChLib.hInstance=hInstDLL;
  32. break;
  33. case DLL_PROCESS_DETACH:   //当系统结束时释放资源
  34. //MessageBox(0,"DLL_PROCESS_DETACH",0,0);
  35. break;
  36.     }
  37.     return TRUE;
  38. }
  39. //键盘过滤,0为不过滤
  40. MYLIBAPI BOOL myImeProcessKey(long *fcmywnd,char *SendCH,char*Control,HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
  41. {
  42. CMyWnd *cmywnd;
  43. BOOL fRet = FALSE;
  44. try
  45. {
  46. if(*fcmywnd==0)
  47. {
  48. //MessageBox(0,"GetWinHWND致命错误fcmywnd所指对象已释放",0,0);
  49. return 0;
  50. }
  51. cmywnd=(CMyWnd *)*fcmywnd;
  52. fRet =cmywnd->myImeProcessKey(SendCH,Control,hIMC,vKey,lKeyData, lpbKeyState);
  53.   } catch (...) {
  54.        MessageBox(0,"SetWinPosition","有错误发生",0);
  55.   }
  56.     return fRet;
  57. }
  58. ///////////////////////////////////////////////////////////
  59. MYLIBAPI long myCreate(char* szClassName, char* szTitle, HWND hWndParent,DWORD himc)
  60. {
  61. CMyWnd *cmywnd=NULL;
  62. char ss[100];
  63. sprintf(ss,"%d",himc);
  64. //MessageBox(0,"myCreate",ss,0);
  65. cmywnd=new CMyWnd(himc);
  66. cmywnd->Create (szClassName, szTitle, savehInstDLL, hWndParent, WS_POPUP);
  67. return (long)cmywnd;
  68. }
  69. ///////////////////////////////////////////////////////
  70. //在VB中可通过传值得到
  71. MYLIBAPI int  CloseWin(long *fcmywnd)
  72. {
  73. char tt[100]="dd";
  74. CMyWnd *cmywnd;
  75. try
  76. {
  77. if(*fcmywnd==0)
  78. {
  79. //MessageBox(0,"CloseWin致命错误fcmywnd所指对象已释放",0,0);
  80. return 0;
  81. }
  82. cmywnd=(CMyWnd *)*fcmywnd;
  83. //sprintf(tt,"%d",fcmywnd);
  84. //MessageBox(0,"CloseWin",tt,0);
  85. delete cmywnd;  //此处不释放资源就不会出现致使错误。
  86. cmywnd=0;
  87. } catch (...) {
  88.        MessageBox(0,"Error","CloseWin有错误发生",0);
  89.   }
  90. //如果子类窗口不自行消毁自己的窗口,
  91. //当主程序退出时子窗口窗口依然在运行,会引起系统崩溃
  92. return 0;
  93. }
  94. MYLIBAPI long  GetWinHWND(long *fcmywnd)
  95. {
  96. CMyWnd *cmywnd;
  97. if(*fcmywnd==0)
  98. {
  99. //MessageBox(0,"GetWinHWND致命错误fcmywnd所指对象已释放",0,0);
  100. return 0;
  101. }
  102. cmywnd=(CMyWnd *)*fcmywnd;
  103. return (long)cmywnd->m_hWnd;
  104. }
  105. MYLIBAPI long  GetSoftKbdWnd(long *fcmywnd)
  106. {
  107. CMyWnd *cmywnd;
  108. if(*fcmywnd==0)
  109. {
  110. //MessageBox(0,"GetWinHWND致命错误fcmywnd所指对象已释放",0,0);
  111. return 0;
  112. }
  113. cmywnd=(CMyWnd *)*fcmywnd;
  114. return (long)cmywnd->ConWind->keyboard->CIMEhSoftKbdWnd;
  115. }
  116. //设置主窗口位置
  117. MYLIBAPI int  SetWinPosition(long *fcmywnd, HWND hWnd ,long *x ,long *y)
  118. {
  119. CMyWnd *cmywnd;
  120. try
  121. {
  122. if(*fcmywnd==0)
  123. {
  124. //MessageBox(0,"SetWinPosition致命错误fcmywnd所指对象已释放",0,0);
  125. return 1;
  126. }
  127. cmywnd=(CMyWnd *)*fcmywnd;
  128. MyMoveWin(cmywnd, hWnd ,*x,*y);
  129.   } catch (...) {
  130.        MessageBox(0,"SetWinPosition","有错误发生",0);
  131.   }
  132. return 0;
  133. }
  134. MYLIBAPI int SetinputPos(long *fcmywnd,long *x ,long *y)
  135. {
  136. CMyWnd *cmywnd;
  137. if(*fcmywnd==0)
  138. {
  139. //MessageBox(0,"SetinputPos致命错误fcmywnd所指对象已释放",0,0);
  140. return 1;
  141. }
  142. cmywnd=(CMyWnd *)*fcmywnd;
  143. SetWindowPos(cmywnd->inputWind->m_hWnd, 0, *x,*y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  144. return 0;
  145. }
  146. MYLIBAPI int SetConPosition(long *fcmywnd,long *x ,long *y)
  147. {
  148. CMyWnd *cmywnd;
  149. if(*fcmywnd==0)
  150. {
  151. //MessageBox(0,"SetConPosition致命错误fcmywnd所指对象已释放",0,0);
  152. return 1;
  153. }
  154. cmywnd=(CMyWnd *)*fcmywnd;
  155. SetWindowPos(cmywnd->ConWind->m_hWnd, 0, *x,*y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  156. return 0;
  157. }
  158. MYLIBAPI int  HideWin(long *fcmywnd)
  159. {
  160. CMyWnd *cmywnd;
  161. if(*fcmywnd==0)
  162. {
  163. //MessageBox(0,"HideWin致命错误fcmywnd所指对象已释放",0,0);
  164. return 1;
  165. }
  166. cmywnd=(CMyWnd *)*fcmywnd;
  167. ShowWindow(cmywnd->m_hWnd, SW_HIDE);
  168. ShowWindow(cmywnd->inputWind->m_hWnd, SW_HIDE);
  169. //SetShowString(fcmywnd,"","");
  170. return 0;
  171. }
  172. MYLIBAPI int  HideAllWin(long *fcmywnd)
  173. {
  174. CMyWnd *cmywnd;
  175. if(*fcmywnd==0)
  176. {
  177. //MessageBox(0,"HideWin致命错误fcmywnd所指对象已释放",0,0);
  178. return 1;
  179. }
  180. cmywnd=(CMyWnd *)*fcmywnd;
  181. cmywnd->stopflash=1;
  182. ShowWindow(cmywnd->m_hWnd, SW_HIDE);
  183. ShowWindow(cmywnd->inputWind->m_hWnd, SW_HIDE);
  184. ShowWindow(cmywnd->ConWind->m_hWnd, SW_HIDE);
  185. ShowWindow(cmywnd->myQQWind->m_hWnd, SW_HIDE);
  186. ShowWindow(cmywnd->ConWind->keyboard->CIMEhSoftKbdWnd, SW_HIDE);
  187. //SetShowString(fcmywnd,"","");
  188. return 0;
  189. }
  190. MYLIBAPI int  UpdateWinShow(long *fcmywnd,DWORD himc)
  191. {
  192. CMyWnd *cmywnd;
  193. // char ss[11];
  194. try{
  195. if(*fcmywnd==0)
  196. {
  197. //MessageBox(0,"UpdateWinShow致命错误fcmywnd所指对象已释放",0,0);
  198. return 1;
  199. }
  200. cmywnd=(CMyWnd *)*fcmywnd;
  201. cmywnd->stopflash=0;
  202. cmywnd->myPaintTxt(0,actSetstr);
  203. cmywnd->inputWind->myPaintTxt(0,actSetstr);
  204. cmywnd->ConWind->myPaintTxt(0);
  205. ShowWindow(cmywnd->ConWind->m_hWnd, SW_SHOWNOACTIVATE);
  206. if(cmywnd->inputWind->showtxt[0])
  207. {
  208. ShowWindow(cmywnd->inputWind->m_hWnd, SW_SHOWNOACTIVATE);
  209. ShowWindow(cmywnd->m_hWnd, SW_SHOWNOACTIVATE);
  210. }
  211. cmywnd->ConWind->keyboard->Curhimc= himc;
  212. if(cmywnd->ConWind->keyboard->showflage==1)
  213. {
  214. if(cmywnd->ConWind->keyboard->CIMEhSoftKbdWnd!=NULL)
  215. {
  216. ImmShowSoftKeyboard(cmywnd->ConWind->keyboard->CIMEhSoftKbdWnd,SW_SHOWNOACTIVATE);
  217. }
  218. }
  219.   } catch (...) {
  220.        MessageBox(0,"UpdateWinShow","有错误发生",0);
  221.   }
  222. return 0;
  223. }
  224. MYLIBAPI int  SetShowString(long *fcmywnd,char*MindleStr,char*InputStr)
  225. {
  226. static int nullflag=0;
  227. CMyWnd *cmywnd;
  228. try
  229. {
  230. if(*fcmywnd==0)
  231. {
  232. //MessageBox(0,"SetShowString致命错误fcmywnd所指对象已释放",0,0);
  233. return 1;
  234. }
  235. cmywnd=(CMyWnd *)*fcmywnd;
  236. cmywnd->stopflash=0;
  237. cmywnd->settxt(MindleStr);
  238. {
  239. int i,len;
  240. if(InputStr!=NULL)
  241. {
  242. len=strlen(InputStr);
  243. for(i=0;i<len;i++)
  244. cmywnd->inputWind->showtxt[i]=InputStr[i];
  245. cmywnd->inputWind->showtxt[i]=0;
  246. }
  247. else
  248. cmywnd->inputWind->showtxt[0]=0;
  249. }
  250. /*
  251. if(InputStr!=NULL)
  252. strcpy(cmywnd->inputWind->showtxt,InputStr);
  253. else
  254. cmywnd->inputWind->showtxt[0]=0;
  255. */
  256. cmywnd->myPaintTxt(0,actSetstr);
  257. cmywnd->inputWind->myPaintTxt(0,actSetstr);
  258. if(cmywnd->inputWind->showtxt[0]==0)
  259. nullflag++;
  260. else
  261. nullflag=0;
  262. if(nullflag>1)
  263. {
  264. ShowWindow(cmywnd->m_hWnd,SW_HIDE);
  265. if(nullflag>2)
  266. ShowWindow(cmywnd->inputWind->m_hWnd,SW_HIDE);
  267. }
  268. else
  269. {
  270. ShowWindow(cmywnd->m_hWnd,SW_SHOWNOACTIVATE);
  271. ShowWindow(cmywnd->inputWind->m_hWnd,SW_SHOWNOACTIVATE);
  272. }
  273.   } catch (...) {
  274.        MessageBox(0,"SetShowString","有错误发生",0);
  275.   }
  276. return 0;
  277. }
  278. MYLIBAPI int  SetWinSize(long *fcmywnd,long *Width ,long *Height)
  279. {
  280. CMyWnd *cmywnd;
  281. RECT  drc;
  282. if(*fcmywnd==0)
  283. {
  284. //MessageBox(0,"SetWinSize致命错误fcmywnd所指对象已释放",0,0);
  285. return 1;
  286. }
  287. cmywnd=(CMyWnd *)*fcmywnd;
  288. GetWindowRect(cmywnd->m_hWnd,&drc);
  289. MoveWindow(cmywnd->m_hWnd,drc.left,drc.top,*Width,*Height,TRUE);
  290. return 0;
  291. }
  292. //////////////////////////////////////////////////////////////////////////////
  293. //  内部函数
  294. //  需要类CMyWnd支持
  295. int MyMoveWin(CMyWnd *cmywnd,HWND hWnd ,long x,long y)
  296. {
  297. RECT LoWinRect,ParentWinRect,screenrc;
  298. long h,w,temy;
  299. static int savy;;
  300. int trace;
  301. //char ss[100];
  302. //sprintf(ss,"%d",cmywnd->m_hWnd);
  303. //MessageBox(0,"Main create",ss,0);
  304. temy=y;
  305. SystemParametersInfo(SPI_GETWORKAREA,0, &screenrc,0);
  306. GetWindowRect(cmywnd->m_hWnd,&LoWinRect); 
  307. if(IsWindow(hWnd))
  308. {
  309. GetWindowRect(hWnd,&ParentWinRect); 
  310. }
  311. else
  312. {
  313. ParentWinRect.right=0;
  314. ParentWinRect.left=0;
  315. ParentWinRect.top=0;
  316. ParentWinRect.bottom=0;
  317. }
  318. w=LoWinRect.right-LoWinRect.left;
  319. h=LoWinRect.bottom-LoWinRect.top;
  320. if((x>10000 && y>10000)||(x<=0 && y<=0))
  321. return 0;
  322. x=x+ParentWinRect.left;
  323. y=y+ParentWinRect.top+cmywnd->inputWind->ControlHeight;
  324. //如果座标远离窗口时才移动。
  325. trace=(int)(cmywnd->myResM.traceflage[0]-'0');
  326. if(trace<9)
  327. {
  328. int t,con;
  329. trace=trace*20;
  330. t=LoWinRect.left-x;
  331. if(t> trace || t<-trace|| savy!=temy )
  332. {
  333. savy=temy;
  334. con=cmywnd->inputWind->ControlHeight;
  335. if(x<screenrc.left )
  336. x=screenrc.left;
  337. if( x>screenrc.right-w)
  338. x=screenrc.right-w;
  339. if( y<screenrc.top )
  340. y=screenrc.top;
  341. if(y>screenrc.bottom-h-con )
  342. {
  343. //y=screenrc.bottom-h;
  344. y=y-con-h-40;
  345. MoveWindow(cmywnd->m_hWnd,x,y,w,h,TRUE);
  346. y=y+h;
  347. x=x+20;
  348. MoveWindow(cmywnd->inputWind->m_hWnd,x,y,w,con,TRUE);
  349. }
  350. else
  351. {
  352. y=y+10;
  353. MoveWindow(cmywnd->inputWind->m_hWnd,x,y,w,con,TRUE);
  354. y=y+con;
  355. MoveWindow(cmywnd->m_hWnd,x,y,w,h,TRUE);
  356. }
  357. // SetWindowPos(cmywnd->ConWind->m_hWnd, 0, x,y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  358. }
  359. }
  360. return 0;
  361. }
  362. /////////////////////////////////////////////////////////////
  363. //下面为函数部分
  364. //用于向系统发送消息
  365. BOOL GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg)
  366. {
  367.     LPINPUTCONTEXT lpIMC;
  368. if( (lpIMC = ImmLockIMC(hIMC)) == NULL ) 
  369. return FALSE;
  370.     
  371.     if (IsWindow(lpIMC->hWnd))
  372.     {
  373.         LPDWORD lpdw;
  374.         if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf,
  375. sizeof(DWORD) * (lpIMC->dwNumMsgBuf +1) * 3)))
  376.             return FALSE;
  377.         if (!(lpdw = (LPDWORD)ImmLockIMCC(lpIMC->hMsgBuf)))
  378.             return FALSE;
  379.         lpdw += (lpIMC->dwNumMsgBuf) * 3;
  380.         *((LPGENEMSG)lpdw) = *lpGeneMsg;
  381.         ImmUnlockIMCC(lpIMC->hMsgBuf);
  382.         lpIMC->dwNumMsgBuf++;
  383.         ImmGenerateMessage(hIMC);
  384.     }
  385. ImmUnlockIMC(hIMC);
  386.     return TRUE;
  387. }