【发布时间】:2010-09-17 10:59:49
【问题描述】:
我正在用 Delphi 编写一个使用 SQLite3 数据库的应用程序。我希望能够在按住某些修饰键(例如 CTRL + SHIFT)的同时启动应用程序,以发出重新初始化数据库的信号。
我如何才能在持有这些键时捕获应用程序已启动?
【问题讨论】:
我正在用 Delphi 编写一个使用 SQLite3 数据库的应用程序。我希望能够在按住某些修饰键(例如 CTRL + SHIFT)的同时启动应用程序,以发出重新初始化数据库的信号。
我如何才能在持有这些键时捕获应用程序已启动?
【问题讨论】:
Tim 有正确的答案,但您可能需要更多框架:
procedure TForm56.Button1Click(Sender: TObject);
begin
if fNeedReinit then
ReinitializeDatabase;
end;
procedure TForm56.FormCreate(Sender: TObject);
begin
fNeedReinit := False;
end;
procedure TForm56.FormShow(Sender: TObject);
begin
fNeedReinit := (GetKeyState(VK_SHIFT) < 0) and (GetKeyState(VK_CONTROL) < 0);
end;
使用稍后的事件更改 Button1Click,以检查是否已设置 fNeedReinit。如果您无法捕捉到击键,您还可以在主窗体上设置 KeyPreview。我刚刚测试了上面的代码,它可以工作,但如果你有启动画面等,那么它可能会改变一些事情。
【讨论】:
if (GetKeyState(VK_SHIFT) < 0) and (GetKeyState(VK_CONTROL) < 0) then
ReinitializeDatabase;
【讨论】:
尝试GetAsyncKeyState、GetKeyState 或GetKeyboardState API 函数之一,以在程序启动时读取 ctrl 和 shift 键的当前状态。在启动时添加键盘钩子可能不起作用,因为在您的应用程序有机会安装钩子之前,Shift 键的按键事件可能已经发生。
【讨论】:
您必须在应用程序中捕获键盘挂钩。 See Here 然后在显示主窗体之前处理钩子 - 例如在 dpr 文件中的 CreateForm 和 Run 之前
【讨论】: