2017-06-21 41 views
0

UPDATE: 我的機器上的另一個進程干擾了快捷方式檢測。delphi XE7中的KeyDown需要轉移到寄存器

在VCL TStringgrid我想複製使用「CTRL + C 「和/或內容」 CTRL + C」

代碼段:上述

procedure TEditWaterFrame.sgSSPKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    if (ssCtrl in Shift) AND ((Key = Ord('c')) OR (key = Ord('C'))) then // this just won't work without me holding ssShift as well, I'm clueless...! 
    begin 
     ShowMessage('Ctrl+C pressed as keys'); 
     try 
      Clipboard.AsText := writeSSPToCSVString(#9); 
     finally 
      Clipboard.Free; 
     end; 
    end; 

end; 

// trying with keypress 
procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char); 
begin 
    if (Key = ^c) then // this just won't work without me holding ssShift as well, I'm clueless...! 
    begin 
     ShowMessage('Ctrl+C pressed as char'); 
     try 
      Clipboard.AsText := writeSSPToCSVString(#9); 
     finally 
      Clipboard.Free; 
     end; 
    end; 
end; 

兩個步驟才運行,如果ssCtrl + ssShift + c/C被按下。 未按下ssShift時(即Ctrl + c或Ctrl + C),它不會觸發。

我很困惑!

回答

4

我創建一個空的VCL形成應用,增加了一個字符串網格的主要形式,並且實現的事件處理程序其OnKeyDown事件:

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    if (ssCtrl in Shift) and (key = Ord('C')) then 
    Beep; 
end; 

的計算機發出蜂鳴當我按下CTRL + C.

程序中的其他內容是處理應用程序中的按鍵。

回到上面的條件,如果CTRL停機,這將會觸發,無論其他修改鍵的狀態如何。所以,你也將響應CTRL + SHIFT C,CTRL + ALT C和CTRL + SHIFT + ALT C.要做到這一點,我懷疑。所以,你可以寫的條件爲:

if (Shift*[ssCtrl,ssShift,ssAlt]=[ssCtrl]) and (key = Ord('C')) then 

注意,有一些代碼中的錯誤的:

  • Clipboard.Free的通話將摧毀你不共享對象擁有。你不能這樣做。刪除這些電話。
  • 您的if聲明的邏輯錯誤。測試Key = Ord('c')總是錯誤的。當按下鍵時,無論修飾鍵的狀態如何,您都必須測試大寫字母序號Key = Ord('C')
  • 您的情況的形式爲if a and b or c。運算符優先級表示這被評估爲if (a and b) or c。這不是你想要的。

所有這一切都是沒有實際意義的,因爲按不考慮修改狀態的C鍵,當你的條件計算True。結論仍然是一樣的:別的東西在處理CTRL + C並停止按鍵事件到達您的代碼。

+0

感謝突出的邏輯錯誤。 我原本有'如果a和(b或c)',但沒有產生結果,所以我顯然玩過,直到聲明觸發爲止。 我會發現解決方案,如果我找到它。 – 2sloth

+0

請不要發佈解決方案,因爲它將依賴不在問題中的信息。沒有什麼可以添加到這個主題。 –

0

下面的作品就好了,我按CTRL-C時:

procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char); 
begin 
    if (Key = #3) then // ^c also works 
    begin 
    ShowMessage('Ctrl+C pressed'); 
    ... 
    end; 
end; 

如果你想CTRL-C,而不是CTRL + SHIFT + CCTRL + ALT + C等,您將不得不使用Get(Async)KeyState()確保SHIFTALT鍵也不是b eing壓:

procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char); 
begin 
    if (Key = #3) then // ^c also works 
    begin 
    if (GetKeyState(VK_SHIFT) = 0) and (GetKeyState(VK_MENU) == 0) then 
    begin 
     ShowMessage('Ctrl+C pressed'); 
     ... 
    end; 
    end; 
end; 

procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char); 
begin 
    if (Key = #3) then // ^c also works 
    begin 
    if (GetAsyncKeyState(VK_SHIFT) >= 0) and (GetAsyncKeyState(VK_MENU) >= 0) then 
    begin 
     ShowMessage('Ctrl+C pressed'); 
     ... 
    end; 
    end; 
end;