我想做一個程式,按下全域熱鍵時,把剪貼板的內容,貼到其它程式(如記事本)的游標處。
只差最后一步了,做不出來,請大家給予幫助。 思路如下:
第1步,注冊全域熱鍵:
void __fastcall TMainBox::FormCreate(TObject *Sender)
{
RegisterHotKey(Handle, 0x1001, MOD_CONTROL, 0x31); //Ctrl+1
}
第2步,監測熱鍵是否按下:
void __fastcall TMainBox::OnWMSysCommand(TMessage &Message)
{
if(Message.WParam==0x1001) N1Click(Application); //如果按下Ctrl+1,執行N1Click程序。
}
第3步,熱鍵回應程序。
//#include <clipbrd.hpp> //包含剪貼板頭檔案
void __fastcall TMainBox::N1Click(TObject *Sender)
{
Clipboard()->AsText = "111"; //將系統剪貼板內容置為文本“111”
/*
這時候,打開了記事本,按下了Ctrl+1,剪貼板里變為111,
按下Ctrl+v,才能把文字貼到記事本的游標處,
怎樣不用按Ctrl+v,剪貼板文字直接輸出到游標處呢? 求幫助,謝謝。
//下面的代碼模擬發送Ctrl+v,試驗不成功。
HWND hWnd;
hWnd = GetForegroundWindow(); // 得到當前視窗句柄
keybd_event(VK_CONTROL, 0, 0, 0);
PostMessage(hWnd, WM_KEYDOWN, 0x76, 0);
PostMessage(hWnd, WM_KEYUP, 0x76, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
*/
}
uj5u.com熱心網友回復:
向目標視窗發送 WM_PASTE 訊息uj5u.com熱心網友回復:
謝謝老妖,能不能稍微具體點。uj5u.com熱心網友回復:
暈,還要多具體啊,你不是取得句柄了么:hWnd = GetForegroundWindow();
::SendMessage(hWnd, WM_PASTE, 0, 0);
uj5u.com熱心網友回復:
試了一下,不行呢。Clipboard()->AsText = "111";
HWND hWnd;
hWnd = GetForegroundWindow(); // 得到當前視窗
PostMessage(hWnd, WM_PASTE,0,0);
uj5u.com熱心網友回復:
多謝多謝,老妖。得高人指點,不甚感激。uj5u.com熱心網友回復:
試過了,不行呢,奇怪了。Clipboard()->AsText = "111";
HWND hWnd;
hWnd = GetForegroundWindow(); // 得到當前視窗
SendMessage(hWnd, WM_PASTE, 0, 0); //WM_CLOSE
WM_PASTE無效, WM_CLOSE有效退出記事本,煩請再指點一下。
uj5u.com熱心網友回復:
你在什么事件里呼叫這段代碼?如果是一個按鈕的點擊事件,當你點擊按鈕的時候,GetForegroundWindow 回傳的句柄,不是你預期的那個視窗。你用 GetClassName 獲取一下hWnd的類名,然后輸出,看看是你期望的嗎。uj5u.com熱心網友回復:
寫在全域熱鍵程序中,還是不起作用。win7/bcb6,非常奇怪。
void __fastcall TMainBox::OnWMSysCommand(TMessage &Message)
{
if (Message.WParam== 0x1001) {
HWND hWnd;
hWnd = GetForegroundWindow(); // 得到當前視窗
::PostMessage(hWnd, WM_PASTE, 0, 0); //WM_CLOSE SendMessage
}
}
試過 postmessage,sendmessage 都不對。
最后這樣, 模擬按鍵試成功了。
void __fastcall TMainBox::OnWMSysCommand(TMessage &Message)
{
if (Message.WParam== 0x1001) {
Clipboard()->AsText = "My text.";
//發送Ctrl+V操作
keybd_event(17, MapVirtualKey(17, 0), 0, 0); //按下Ctrl鍵
keybd_event(86, MapVirtualKey(86, 0), 0, 0);
keybd_event(86, MapVirtualKey(86, 0), KEYEVENTF_KEYUP, 0);
keybd_event(17, MapVirtualKey(17, 0), KEYEVENTF_KEYUP, 0); //釋放Ctrl鍵
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83412.html
上一篇:Windows驅動中,在請求程序中掛起了該請求,驗證結果有點出乎意料
下一篇:影像拼接問題?
