可是我用WinSight获得了窗体的句柄,但是我不知道如何控制外部程序的按钮,比如
用户按了我的‘拨号’按钮就相当于按了dialer 中的‘拨号’按钮。
另外我不知道如何获得一个"按钮"的句柄。
也不知道发送什么消息才能灵活控制外部应用程序。
我让我的程序模拟按下按键来控制
procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
begin
h:=winprocs.FindWindow(nil,'电话拨号程序');
if h=0 then
begin
winexec(pchar('dialer.exe'),SW_SHOWNORMAL); 显然这种方法不能让dialer隐藏。
SendKeys('10060');
keybd_event(VK_RETURN,0,0,0);
end
else
begin
SendKeys('10060');
SimulateKeystroke(VK_RETURN, 0);
end;
end;
SendKeys实现如下:
procedure SendKeys(s : string);
var
i : integer;
flag : bool;
w : word;
begin
{Get the state of the caps lock key}
flag := not GetKeyState(VK_CAPITAL) and 1 = 0;
{If the caps lock key is on then turn it off}
if flag then
SimulateKeystroke(VK_CAPITAL, 0);
for i := 1 to Length(s) do begin
w := VkKeyScan(s);
{If there is not an error in the key translation}
if ((HiByte(w) <> $FF) and
(LoByte(w) <> $FF)) then begin
{If the key requires the shift key down - hold it down}
if HiByte(w) and 1 = 1 then
SimulateKeyDown(VK_SHIFT);
{Send the VK_KEY}
SimulateKeystroke(LoByte(w), 0);
{If the key required the shift key down - release it}
if HiByte(w) and 1 = 1 then
SimulateKeyUp(VK_SHIFT);
end;
end;
{if the caps lock key was on at start, turn it back on}
if flag then
SimulateKeystroke(VK_CAPITAL, 0);
end;
SimulateKeystroke实现如下:
procedure SimulateKeystroke(Key : byte;
extra : DWORD);
begin
keybd_event(Key,
extra,
0,
0);
keybd_event(Key,
extra,
KEYEVENTF_KEYUP,
0);
end;
有没有其他更好更灵活的方法啊!