2013-07-08 44 views
0

從本質上講,這種微型Windows窗體C#(.NET 3.5)的應用是有聆聽某個事件的問題。我的形式事件函數/將焦點設置僅適用於包含的MessageBox

我設置兩個按鈕,直接叫我的兩個主要功能(這些按鍵發送到另一個進程窗口,切換我的布爾顯示,如果它被髮送或沒有)。

是有問題的部分是,我要監控自動閃光,這兩個按鈕的功能相同功能的實際事件。該事件處理是不僅沒有成功,如果我不包括MessageBox.Show("Blah Blah");

例子:

public tester() 
InitializeComponent(); 
wsiRemote.clsWsiEventsClass Events = new wsiRemote.clsWsiEventsClass(); 
Events.AuthorRecordStarted += new __clsWsiEvents_AuthorRecordStartedEventHandler(Events_AuthorRecordStarted); 
private static bool _pedcheck = false; 
    public static void SendkeyT() 
    { 
     foreach (Process w in System.Diagnostics.Process.GetProcessesByName("WinScribe Internet Author")) 
     { 
      IntPtr hwnd = w.MainWindowHandle; 
      SetForegroundWindow(hwnd); 
     } 

     if (_pedcheck == false) 
     { 
      foreach (Process p in System.Diagnostics.Process.GetProcessesByName("Pedable")) 
      { 
        IntPtr hWnd = p.MainWindowHandle; 
        SetForegroundWindow(hWnd); 
       InputSimulator.SimulateKeyDown(VirtualKeyCode.CONTROL); 
       InputSimulator.SimulateKeyPress(VirtualKeyCode.VK_D); 
       InputSimulator.SimulateKeyUp(VirtualKeyCode.CONTROL); 
       _pedcheck = true; 
      } 
     else 
     { 
      MessageBox.Show("Boolean Failure"); 
     } 

    } 
    public void button1_Click(object sender, EventArgs e) 
    { 
     SendkeyT(); 
    } 

    public void Events_AuthorRecordStarted(string msg) 
    { 
     // MessageBox.Show("Recording Started"); 
     SendkeyT(); 
    } 

如果我取消的消息框,它觸發關閉並顯示框給用戶。一旦用戶點擊好,該功能正常啓動。我注意到,如果我沒有包含消息框,正在發送密鑰並激活的窗口開始在任務欄中閃爍,所以我假設它與前臺設置有關。

 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool SetForegroundWindow(IntPtr hWnd); 

如果有人有任何建議,我將不勝感激。

謝謝!

+0

「我已經注意到了,正在發送鍵和作出了積極的任務欄開始閃爍,如果我不包括在MessageBox窗口中的」閃爍的症狀聽起來,禁止應用程序從偷焦點操作系統設置。它可以在舊的TweakUI應用程序中使用,也可以通過編輯註冊表手動完成。目標系統偶然啓用了這個功能嗎? –

+0

謝謝你的回覆@Idle_Mind。我只是檢查一下,我不認爲這是問題(據我所知)。我仍然無法解釋爲什麼按鈕方法工作正常,但基於API的鉤子不是(除非調用'MessageBox.Show')。從我所知道的情況來看,我認爲這可能與通過事件調用利用'object sender,EventArgs e'的按鈕有關。我將繼續關注用戶界面問題,感謝您的協助。你有沒有其他想法?再次感謝你! – mbeacom

回答

1

有些時候,「應用程序」的主窗口句柄不是「邏輯」主窗口的句柄(您要設置它的焦點),而且大多數時候,主窗口甚至是隱藏的,所以設置焦點沒有任何區別。

嘗試itterating進程的窗口,找到你需要設置forground之一。

可以以探討您的應用程序中使用的Process Explorer。 (如果它是您要採取行動的特定應用程序)。

使用:How to enumerate all windows within a process? 幫助獲取子窗口。

0
MessageBox.Show(this, "my message"); 

將「this」傳遞給MessageBox.Show方法解決了我的問題。

相關問題