2011-09-14 24 views
7

Tôi đang tạo một ứng dụng Windows để ghi lại đầu vào bàn phím trên toàn cầu. Khi người dùng sử dụng tổ hợp phím tắt CTRL + ALT + G, ứng dụng sử dụngTại sao SendKey.Send() chỉ hoạt động một lần trong một thời gian?

SendKey.Send(Guid.NewGuid().ToString()); 

để nhập GUID tổng hợp vào bất kỳ trường văn bản nào đang được lấy nét. Và nó nên làm điều này bất kể ứng dụng lấy đầu vào.

Nó hoạt động chính xác như tôi dự định lần đầu tiên bạn gõ CTRL + ALT + G nhưng các lần thử tiếp theo sẽ dẫn đến không thành công hoặc chỉ thành công không thường xuyên.

Ý tôi là, tất cả sẽ rất đơn giản và nhất quán. Tôi có một cái móc bàn phím toàn cầu đang hoạt động luôn hoạt động mọi lúc, tôi đã thử nghiệm nó, nhưng phương thức SendKey.Send() không hoạt động mọi lúc.

Tôi đã xem tất cả mọi thứ trên Google về bất kỳ điều gì liên quan đến vấn đề của tôi nhưng không có gì có hiệu quả cho đến thời điểm này.

Bất kỳ ai có thông tin chi tiết?

CHỈNH SỬA 1: Tôi cũng đã thử sử dụng SendKey.SendWait(), thực hiện tương tự. Tôi thực sự muốn có một cách đáp ứng tốt hơn để tạo GUID mới bằng cách sử dụng cách tiếp cận phím tắt này.

EDIT 2:

Dưới đây là bộ phận thiết yếu của mã:

/* Initialization Code Here */ 
// register the event that is fired after the key press. 
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed); 
// register the control + alt + F12 combination as hot key. 
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G); 

Mã sự kiện khá đơn giản:

void hook_KeyPressed(object sender, KeyPressedEventArgs e) 
{ 
    SendKeys.SendWait(Guid.NewGuid().ToString()); 
} 

Mọi thứ khác trong dự án của tôi chỉ là lông tơ.

Cập nhật 1:

tôi có nhiều câu hỏi về chủ đề này, nhưng tôi hết thời gian để tiếp tục làm việc về vấn đề này cho ngày hôm nay. Tôi đã thực hiện đề xuất của Jon Raynor về việc sử dụng cách tiếp cận app.config với một mức độ thành công nào đó. Khi tôi cô lập các vấn đề mới của tôi, tôi sẽ đăng một bản chỉnh sửa và có thể đóng câu hỏi này nếu tôi nhận được ứng dụng của tôi hoạt động như dự định.

+0

Ý của bạn là gì khi chụp đầu vào bàn phím trên toàn cầu? Nếu bạn đang làm điều đó không có nghĩa là bạn cũng nhận được GUID. Chắc chắn bạn muốn RegisterHotKey. –

+0

Tôi đang sử dụng mã PIN RegisterHotKey cho dự án này. Việc chụp các phím nóng rất dễ, vấn đề là với phương thức SendKey.Send(). – LamdaComplex

+0

Khi trong mã của bạn, bạn gọi SendKey.Send? –

Trả lời

7

Bạn có thể gặp sự cố về thời gian. Theo MSDN documentation:

Lớp SendKeys đã được cập nhật cho .NET Framework 3.0 để cho phép việc sử dụng nó trong các ứng dụng chạy trên Windows Vista. Bảo mật nâng cao của Windows Vista (được gọi là Kiểm soát tài khoản người dùng hoặc UAC) ngăn việc triển khai trước đó hoạt động như mong đợi.

Lớp SendKeys dễ bị các vấn đề về thời gian, trong đó một số nhà phát triển đã phải làm việc xung quanh . Việc triển khai được cập nhật là vẫn dễ bị các vấn đề về thời gian, nhưng hơi nhanh hơn và có thể yêu cầu thay đổi đối với các giải pháp thay thế. Lớp SendKeys cố gắng sử dụng thực hiện trước đó trước và nếu không thành công, hãy sử dụng triển khai mới. Do đó, lớp SendKeys có thể hoạt động khác nhau trên các hệ điều hành khác nhau.Ngoài ra, khi lớp SendKeys sử dụng triển khai mới, phương thức SendWait sẽ không chờ đợi các thông báo được xử lý khi chúng được gửi đến một quy trình khác.

Nếu ứng dụng của bạn dựa trên hành vi nhất quán bất kể hệ điều hành , bạn có thể buộc lớp SendKeys sử dụng triển khai mới bằng cách thêm cài đặt ứng dụng sau vào tệp ứng dụng .

<appSettings> 

<add key="SendKeys" value="SendInput"/> 

</appSettings> 

Để buộc các lớp SendKeys để sử dụng các cài đặt trước đó, sử dụng giá trị "JournalHook" để thay thế.

+0

Cảm ơn bạn đã phản hồi. Nó đã giúp đưa tôi đi đúng hướng. Mặc dù điều này sẽ dạy tôi đọc tài liệu MSDN cẩn thận hơn. Tôi đang tiếp tục gặp vấn đề với đơn đăng ký của mình nhưng có thể là do các vấn đề khác. Nếu tôi cô lập vấn đề tôi có thể cập nhật câu hỏi này. – LamdaComplex

1

Điều này sẽ không giải quyết vấn đề chính xác của bạn, nhưng là một cách tiếp cận khác. Tôi đã thử nghiệm với móc khóa toàn cầu trong mã được quản lý trước đây. Đó là một nỗi đau. Như hokey và nguyên thủy như nó âm thanh, tôi yêu AutoHotKey. Bạn có thể làm một số điều thực sự mạnh mẽ với nó.

Đây là mẫu đạt yêu cầu của bạn về việc kết nối toàn cục Ctrl + Alt + G và nhập một guid. Phần tốt nhất là nó biên dịch nội tuyến C# để bạn vẫn có thể sử dụng System.Guid.NewGuid(). Một khi bạn có một kịch bản làm việc, bạn có thể biên dịch nó thành một exe để một người không có AutoHotKey được cài đặt có thể chạy nó.

#NoEnv 
#SingleInstance 
#Include CLR.ahk 
#Include COM.ahk 

;minimize delay between key presses 
SetKeyDelay, -1 

;create c# code 
CLR_Start() 
_g := CLR_CompileC#("class c{public string GetNewGuid(){return System.Guid.NewGuid().ToString();}}", "System.dll").CreateInstance("c") 

;hook keyboard ctrl+alt+g 
^!g::InsertGuid() 

;generate a guid and type it 
InsertGuid() { 
    global 
    local guid := _g.GetNewGuid() 
    Send,%guid% 
} 

Nếu bạn muốn thử nó ra, cài đặt AutoHotKey_L sau đó tải thêm hai kịch bản herehere.

+0

Giống như bạn, thử nghiệm này cho đến nay không mang lại gì ngoài sự thất vọng, đặc biệt là xem xét nó dễ dàng như thế nào. Nhưng sau đó một lần nữa tôi thực sự biết rất ít về cách các lệnh hotkey truyền thống được thực hiện trong Windows. Tôi sẽ thử giải pháp AutoHotKey của bạn và sớm cập nhật câu hỏi này. – LamdaComplex

Các vấn đề liên quan