几何尺寸与公差论坛

 找回密码
 注册
查看: 2281|回复: 2

【转帖】 遍历对话框里的static控件

[复制链接]
发表于 2008-2-13 16:36:44 | 显示全部楼层 |阅读模式
遍历对话框里的static控件
::ShowWindow(hwnd,SW_RESTORE);   
  ::SetForegroundWindow(hwnd);   
  keybd_event(VK_MENU,0,0,0);//按下Alt   
  keybd_event(82,0,0,0);//按下R键   
  keybd_event(82,0,KEYEVENTF_KEYUP,0);//松开R键   
  keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);//....
参考参考,俺的代码。
 楼主| 发表于 2008-2-13 16:37:25 | 显示全部楼层

回复: 【转帖】 遍历对话框里的static控件

HWND   tmpa=::FindWindow("#32770   (Dialog)",NULL);   
  tmpa=::FindWindowEx(tmpa,NULL,"Edit",NULL);   
                                      char   *msg;   
  CString   tmp;   
  m_msg.GetWindowText(tmp);   
  msg=tmp.GetBuffer(tmp.GetLength());   
  ::SendMessage(tmpa,WM_SETTEXT,tmp.GetLength(),(long)msg);  
keybd_event   或者sendinput都行,你想写一串,可以用一个数组,循环写,   
  用vkscan()和mapvirtualkey()结合,把字符转化成virtualkey   或者扫描码来发送,
procedure   SendShift(H:   HWnd;   Down:   Boolean);   
  var   
        vKey,   ScanCode:   Word;   
        lParam:   longint;   
  begin   
        vKey:=   $10;   
        ScanCode:=   MapVirtualKey(vKey,   0);   
        lParam:=   longint(ScanCode)   shl   16   or   1;   
        if   not(Down)   then   lParam:=lParam   or   $C0000000;   
        SendMessage(H,   WM_KEYDOWN,   vKey,   lParam);   
  end;   
  {****************************************************}   
  procedure   SendCtrl(H:   HWnd;   Down:   Boolean);   
  var   
        vKey,   ScanCode:   Word;   
        lParam:   longint;   
  begin   
        vKey:=   $11;   
        ScanCode:=   MapVirtualKey(vKey,   0);   
        lParam:=   longint(ScanCode)   shl   16   or   1;   
        if   not(Down)   then   lParam:=   lParam   or   $C0000000;   
        SendMessage(H,   WM_KEYDOWN,   vKey,   lParam);   
  end;   
  {****************************************************}   
  function   TBUSendKey.SendKey(AppName:string;Key:Char):Boolean;   
  var   
        vKey,   ScanCode:   Word;   
        lParam,   ConvKey:   longint;   
        Shift,   Ctrl:   boolean;   
        H:HWND;   
  begin   
        H:=FindWindow(pchar(appname),nil);   
        if   H<>0   then   
        begin   
              ConvKey:=   OemKeyScan(ord(Key));   
              Shift:=   (ConvKey   and   $00020000)   <>   0;   
              Ctrl:=   (ConvKey   and   $00040000)   <>   0;   
              ScanCode:=   ConvKey   and   $000000FF   or   $FF00;   
              vKey:=   ord(Key);   
              lParam:=   longint(ScanCode)   shl   16   or   1;   
              if   Shift   then   SendShift(H,   true);   
              if   Ctrl   then   SendCtrl(H,   true);   
              SendMessage(H,   WM_KEYDOWN,   vKey,   lParam);   
              SendMessage(H,   WM_CHAR,   vKey,   lParam);   
              lParam:=   lParam   or   $C0000000;   
              SendMessage(H,   WM_KEYUP,   vKey,   lParam);   
              if   Shift   then   SendShift(H,   false);   
              if   Ctrl   then   SendCtrl(H,   false);   
              result:=true;   
        end   
        else   result:=false;   
  end;   
        可以对单个程序SendKey,全部就可以用kimryo的方法。还有方法是用Hook,很好的,我就不说了。有问题可以Email:Zeng@zymail.net   
VOID   keybd_event(   
      BYTE   bVk,                               //   virtual-key   code   
      BYTE   bScan,                           //   hardware   scan   code   
      DWORD   dwFlags,                     //   function   options   
      ULONG_PTR   dwExtraInfo       //   additional   keystroke   data   
  );
 楼主| 发表于 2008-2-13 16:38:25 | 显示全部楼层

回复: 【转帖】 遍历对话框里的static控件

msdn   中的例子   
  The   following   sample   program   toggles   the   NUM   LOCK   light   (on   Windows   NT   only)   by   using   keybd_event()   with   a   virtual   key   of   VK_NUMLOCK.     
   
        #include   <windows.h>   
   
        void   SetNumLock(   BOOL   bState   )   
        {   
              BYTE   keyState[256];   
   
              GetKeyboardState((LPBYTE)&keyState);   
              if(   (bState   &&   !(keyState[VK_NUMLOCK]   &   1))   ||   
                      (!bState   &&   (keyState[VK_NUMLOCK]   &   1))   )   
              {   
              //   Simulate   a   key   press   
                    keybd_event(   VK_NUMLOCK,   
                                              0x45,   
                                              KEYEVENTF_EXTENDEDKEY   |   0,   
                                              0   );   
   
              //   Simulate   a   key   release   
                    keybd_event(   VK_NUMLOCK,   
                                              0x45,   
                                              KEYEVENTF_EXTENDEDKEY   |   KEYEVENTF_KEYUP,   
                                              0);   
              }   
        }   
   
        void   main()   
        {   
              SetNumLock(   TRUE   );   
        }   
--------------------------------------------------------------------------------

LPCTSTR lpWindowName = _T("QQ用户登录");
CWnd *pDialog = FindWindow(NULL, lpWindowName);
CWnd * pChild = pDialog->GetWindow(GW_CHILD);

CString sText;

for (; pChild; )
{
pChild->GetWindowText(sText);
if (sText == _T("deg"))
pChild->SetWindowText("mdeg");

pChild = pChild->GetNextWindow(GW_HWNDNEXT);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-13 04:32 , Processed in 0.036112 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表