小编Far*_* H.的帖子

如何在后台线程中使用LoadKeyboardLayout?

我正在使用LoadKeyboardLayout函数以这种方式加载和激活键盘布局:

procedure TfrmMain.eSearchEnter(Sender: TObject);
begin
  LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但它冻结活动形式1-2秒,因为这种变化需要一些时间.为了防止这种情况,我将此代码移动到这样的后台线程:

type
  FLangChangeThread = class(TThread)
  private
    FLang: string;
  protected
    procedure Execute; override;
  public
    property Lang: string read FLang write FLang;
  end;

implementation

procedure FLangChangeThread.Execute;
begin
  if FLang = 'EN' then
    LoadKeyboardLayout('00000409', KLF_ACTIVATE)
  else
  if FLang = 'FA' then
    LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;
Run Code Online (Sandbox Code Playgroud)

这个后台线程我正在以这种方式运行:

procedure TfrmMain.ChangeWritingLanguage(ALang: string);
begin
  with FLangChangeThread.Create(True) do
  begin
    FreeOnTerminate := True;
    Lang := ALang;
    Resume;
  end;
end;

procedure TfrmMain.eSearchEnter(Sender: TObject);
begin
  ChangeWritingLanguage('FA');
end;
Run Code Online (Sandbox Code Playgroud)

问题是,它没有按预期更改键盘布局.我调试了代码并且所有行都被执行了; 只是LoadKeyboardLayout函数没有完成它的工作.

如何从后台线程使 …

delphi tthread keyboard-layout

10
推荐指数
1
解决办法
2636
查看次数

首先在Indy 10的delphi中从服务器开始通信

在由TCPServer/Client组件编程的Socket应用程序中,通常我们是活动服务器端,然后将客户端连接到服务器,当我们需要从一侧获取或发送数据到另一端时,首先我们从客户端向服务器发送命令并且通信将是开始.

但问题是我们总是需要从客户端开始对话!

我想问一下,在没有客户端请求的情况下从服务器端随机开始会话是否有任何想法?

我需要此功能从服务器端通知客户端.例如,当注册用户(客户端)连接到服务器,其他连接用户(在其他客户端)时,通知必须从服务器发送给所有用户(如Yahoo Messenger).

我正在使用TIdCmdTCPServerTIdTCPClient组件

delphi tcp client-server indy tthread

2
推荐指数
1
解决办法
3406
查看次数

标签 统计

delphi ×2

tthread ×2

client-server ×1

indy ×1

keyboard-layout ×1

tcp ×1