我需要在Delphi中模拟按多媒体键(如播放/暂停,上一首/下一首曲目,快退/前进等).我可以使用下一个代码轻松模拟"普通"键:
keybd_event(VK_SPACE,0, 0, 0);
keybd_event(VK_SPACE,0, KEYEVENTF_KEYUP, 0);
Run Code Online (Sandbox Code Playgroud)
另外,我找到了MAKE/BREAK代码列表,但我该怎么办呢?
MSDN说:
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
bVk - Specifies a virtual-key code. The code must be a value in the range 1 to 254.
bScan - Specifies a hardware scan code for the key.
dwFlags - A set of flag bits that specify various aspects of function …Run Code Online (Sandbox Code Playgroud) 我正在 Delphi 中使用 TIdTCPClient/TIdTcpServer indy 组件编写客户端-服务器应用程序。
数据传输通常工作正常,但我经常从服务器读取错误的数据;我得到了以前请求的答案,而不是当前的答案。
在调试期间,两个应用程序都在本地工作,因此传输过程中数据不会丢失。
超时为 1000-3000 毫秒,这足以避免在收到第一个请求的答复之前发送第二个请求。
我使用简单的数据格式:前4个字节是数据包长度,其余是该长度的二进制数据。
服务器端代码是(简化为仅发送字符串;我也以相同的方式使用二进制缓冲区,但此代码更易于理解和检查):
Var
lng: LongInt;
ib: TIdBytes;
begin
// Prepare data to send:
lng:=length(s);// s is an AnsiString to be sent
SetLength(ib,lng+4);
Move(lng,ib[0],4);
Move(s[1],ib[4],length(s));
// Send:
AContext.Connection.IOHandler.WriteDirect(ib);
end;
Run Code Online (Sandbox Code Playgroud)
发送请求的客户端代码是相同的(在最后一行调用 TIdTcpClient.IOHandler.WriteDirect())。读取服务器答案的客户端代码是:
Var
ib: TIdBytes;
size,done,lng: LongInt;
begin
Result:=false;
// answer length:
try
SetLength(ib,0);
tcp.IOHandler.ReadBytes(ib,4,false);
Move(ib[0],size,4);
if length(ib)<0 then Exit;// wrong data
except
on E: Exception do;// code skipped
end;
// read answer body:
done:=0;
b.Clear;// b is my buffer, TStream …Run Code Online (Sandbox Code Playgroud)