2017-03-06 42 views
0

我已爲我的Media Center PC(運行Windows 8.1)編寫了一個屏幕保護程序。這是一個簡單的Windows窗體應用程序,它隨機顯示我的圖片文件夾中的所有圖片,爲每張圖片添加文件夾,文件名,拍攝日期等。它處理Click,MouseMove和KeyDown事件,如果收到任何圖片,則終止。c#檢測所有按鍵(Windows 8.1)

它工作正常,除非如果我按Media Center遙控器上的某些按鍵(如顯示我所有錄音的按鍵),屏幕保護程序不會終止。就好像這些鍵不會生成KeyDown事件。

我試圖把一個全局鍵盤掛鉤,但它似乎並沒有被稱爲 - 我有一個模糊的內存,這些是在更高版本的Windows中不允許的。

有關如何檢測我的媒體中心上遠離C#Windows Forms應用程序的所有按鍵的建議?

的源代碼是github

+0

不確定如何編譯C#.scr文件,因此它是Windows應用程序。我查閱瞭如何用C#編寫屏幕保護程序,這就是我發現的。 –

+0

我發現的一些資源只有運行'Application.Exit()'的表單的MouseClick,MouseMove和KeyPress事件。 –

+0

是的,這就是我所擁有的 - 事件沒有到達媒體中心遠程的某些按鍵(但按鍵在媒體中心正常工作)。 –

回答

0

我能想象的最簡單方法是GetAsyncKeyStatehttps://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx

[DllImport("user32.dll")] 
    static extern short GetAsyncKeyState(int KeyCode); 

這個工程至少,如果你的進程是前臺進程(因爲它應該是,如果它是一個嚴重的屏幕保護程序)。

這也應該處理特殊的鍵(如媒體鍵),因爲那些大多數只是被翻譯成幾個鍵盤快捷鍵。

但是,不利的一面是,您必須手動查詢每個keyCode。但是,由於您已經能夠捕獲常規密鑰,因此我認爲僅輪詢媒體密鑰就足夠了。

+0

不知道如何一個函數,允許我輪詢一個特定的鍵將幫助我確定_any_鍵是否被按下。我想我可以在一個緊密的循環中輪詢它,用vKey參數中的每個可能的整數,但我懷疑這是否是一個好主意:-) –

+0

您可以迭代檢查每個鍵碼(通常在1到255的範圍內)If你發現那裏有任何變化,你很好。 – Psi

+0

我想只要輪詢媒體鍵就足夠了,因爲無論如何你都可以捕獲其他鍵。唯一的挑戰是確定他們的keyCodes(這應該可以再次使用'GetAsyncKeyState'。 – Psi

0

通常,我使用該程序檢測具有特定密鑰ID的任何按鍵。順便說一句,它寫在C++,我很抱歉,我幾乎不知道C#。讓我知道,如果它有幫助與否。 。謝謝@Psi :)

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
#if  _WIN32_WINNT < 0x0500 
#undef _WIN32_WINNT 
#define _WIN32_WINNT 0x0500 
#endif 
#include <windows.h> 
using namespace std; 
int main() 
{ 
    char i; 
    for(i=8; i<190; i++) 
    { 
     if(GetAsyncKeyState(i)== -32767) 
     { 
      cout<<int (i)<<endl; 
     } 
    } 
    return 0; 
}