20071027总结

来源:互联网 发布:农产品网络零售 编辑:程序博客网 时间:2024/05/14 07:05

本周 wpf中 主要是完成了对tab的学习 以及 从目录中读取更多文件信息的技巧.

然而到了周三,就又开始了新一轮的处理文档运动。.

更令人惊诧的是 除了要写文档,一个数月前的项目又返回了一堆问题.而对于硬盘数据全丢的我来说  无疑是一次充分的摧残.为了 保持程序的不被修改.花了1晚上的工夫来研究如何从程序外部来操作程序中的各个控件. 好在之前研究过1段时间外挂.目的还算达到了.可是到了客户那里一调试.自己又傻了。原来哪个控件没有把文本实时刷新到程序中去.结果一晚上的辛苦 对于解决当时的问题来讲 白费了。

不过把期间的经验技巧做一总结,日后自己或者网上的朋友肯定是能用的着的.

问题:寻找程序中的editbox并发送字符串.

思路分为2个方向,一个是找到窗体handle然后 找到editbox handle通过 sendmessage发消息.

此方法可用于可以准确得到editbox handle的情况下.代码如下:

HWND sipahwnd = ::FindWindow(NULL,"**系统");

 //char ab[100];// = "sdfdsf.jpg";
         //  strcpy(ab,_T("dsfdsf.jpg"));
 if (sipahwnd)
 {

  HWND dialoghwnd = ::FindWindow("#32770","打开图像");
  if (dialoghwnd)
  {
   ::SetForegroundWindow(dialoghwnd);
             //得到此进程中的窗体句柄
   HWND edithwnd = ::FindWindowEx(dialoghwnd,0,"Edit",0);

   //遍历得到下一个窗体句柄//getwindow(hwnd,gw_hwndnext);

            if(edithwnd)
   {     
           ::SendMessage(edithwnd,WM_SETTEXT,0,(LPARAM)SipaAdd);
   }

}

}

另外一种方法 得到主程序handle然后激活窗体 用粘贴板把 内容粘入.目前已经可以实现 复制,但是 在激活窗体方面遇到了问题.

   if (OpenClipboard())
   {
     HGLOBAL clipbuffer;
     char *buffer;
     EmptyClipboard();
     clipbuffer = GlobalAlloc(GMEM_DDESHARE,strlen(SipaAdd));
     buffer = (char *)GlobalLock(clipbuffer);
     strcpy(buffer,LPCSTR(SipaAdd));
     GlobalUnlock(clipbuffer);
     SetClipboardData(CF_TEXT,clipbuffer);
    CloseClipboard();
   }
   //把变量拷贝到粘贴版


            ::SetForegroundWindow(sipahwnd);
   ::SetFocus(sipahwnd);
   //::SetCursorPos(400,400);
   //Sleep(200);
   //::PostMessage(sipahwnd,WM_LBUTTONDOWN,1,MAKELONG(200,200));
   ::SendMessage(sipahwnd,WM_LBUTTONDOWN,0,0);
   Sleep(100);
   ::SendMessage(sipahwnd,WM_LBUTTONUP,0,0);

就在我对无法完成任务胆战心惊的时候,突然之前backup的源代码被我发现了。hoho天不绝我.

终于可以好好改了.

周末的时候基本就是忙着送文档, 帮公司做(目前我所在地)各项目的收尾工作,与客户交流.

找到了源代码没想到gdal不能使用.又用了1个多钟头把gdal重新配了1遍.事后才发觉.不能用的原因并不是gdal....不过也无所谓了,就当复习功课了 ^_^

周六,就是今天. 完成了mfc下限制字符串长度,以及限制特定输入的操作。并简单实现了vista下输入序列号的那种输入方式。话不多说:见代码:

限制长度:

DDV_MaxChars(pDX, m_szffs, 20); DDV 是MFC用来处理数据检测的一种简单方法。

限制输入:

int charpos = LOWORD(GetSel());
 CString str;
 GetWindowText(str);
 if (nChar >= '0' && nChar <= '9')
 {
  if (charpos == 4 || charpos ==7)
  {
   str.Insert(charpos,'-');
   SetWindowText(str);
   SetSel(charpos + 1,charpos + 1);
  }
  
  CEdit::OnChar(nChar, nRepCnt, nFlags);
 }
 else if (nChar == VK_BACK)
 {
   if (charpos == 5 || charpos ==8)
  {
   str.Delete(charpos-1,1);
   SetWindowText(str);
   SetSel(charpos - 1,charpos - 1);
  }
  
  CEdit::OnChar(nChar, nRepCnt, nFlags);
 }

此代码实现了 输入yyyy-mm-dd并会自动输入- 但是没有对ymd的范围进行限制。且删除方法不正确也会造成错误输入。不过对于理解cedit以及实现简单的限制已经足够了 希望能对观看者起到帮助作用^_^

 

 

 

原创粉丝点击