几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   vc编程 (http://www.dimcax.com/hust/forumdisplay.php?f=76)
-   -   【转帖】 遍历对话框里的static控件 (http://www.dimcax.com/hust/showthread.php?t=1704)

huangyhg 2008-02-13 04:36 PM

【转帖】 遍历对话框里的static控件
 
遍历对话框里的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);//....
参考参考,俺的代码。

huangyhg 2008-02-13 04:37 PM

回复: 【转帖】 遍历对话框里的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
);

huangyhg 2008-02-13 04:38 PM

回复: 【转帖】 遍历对话框里的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);
}


所有的时间均为北京时间。 现在的时间是 12:58 PM.