web-dev-qa-db-ja.com

Visual BasicでSendKeys()アクセス許可がエラーを拒否しました

VB6アプリで別のウィンドウにSendKeys()コマンドを使用しようとしています。

私が欲しかったのは、ボタンをクリックしてから、アプリがいくつかのキーをそのウィンドウに送信する前に、10秒以内に他のウィンドウに移動することです。私はすべてをソートしましたが、何らかの理由でこのようなものを呼び出すと:

SendKeys ("A")

このエラーが発生します:

Run-time error '70':

Permission denied

誰かがこれを回避する方法を知っていますか?ありがとう。

13
Phox

Windows 7の場合: UAC設定を変更して通知しないようにします。

Windows 8および10の場合:
このメソッドを任意のモジュールに追加します。

Public Sub Sendkeys(text as variant, Optional wait As Boolean = False)
   Dim WshShell As Object
   Set WshShell = CreateObject("wscript.Shell")
   WshShell.Sendkeys cstr(text), wait
   Set WshShell = Nothing
End Sub 

Windows10では問題なく動作しました。

13

カール・ピーターソンがVistaでこれを修正するために何を作成したかを見てみましょう。

SendInput

8
Jim Mack

VB6 SendKeysの代わりに、次のようなWScript.ShellSendKeysがあります。

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "1{+}"

ヘルプについては、 [〜#〜] msdn [〜#〜] を参照してください。

4
Roman Plischke

パブリックモジュールに次を追加します。

Public Sub Sendkeys(text$, Optional wait As Boolean = False)
    Dim WshShell As Object
    Set WshShell = CreateObject("wscript.Shell")
    WshShell.Sendkeys text, wait
    Set WshShell = Nothing
End Sub

これにより、SendKeys関数が「上書き」されます

3

Windows 7の場合:

  • コントロールパネルを開く
  • ユーザーアカウント制御設定の変更
  • 通知しないように変更
  • コンピューターを再起動します
3
Tales

アプリケーションから「msvbvm60.dll」ファイルを削除します

次の手順に従ってください

  1. アプリケーションの.Exeファイルを右クリックし、プロパティをクリックします
  2. [互換性]タブをクリックします
  3. [互換モードでこのプログラムを実行する]をクリックし、そこからWindows Xp SP2を選択します。
  4. [このプログラムを管理者として実行]をクリックします
  5. [OKより適用]をクリックします。
  6. アプリケーションフォルダから「msvbvm60.dll」を削除します。

すべて完了しました。これで、アクセスが拒否されたなどのエラーなしでアプリケーションの実行が開始されます。

2
Abhishek Singh

このAPIを使用します:

Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

そして

keybd_event keycode, 0, 0, 0  'KEY DOWN
keybd_event keycode, 0, KEYEVENTF_KEYUP, 0 'KEY UP

キーコードがスペースの場合は32、キーエンドの場合は35、vbKeyBackの場合は8などの場合。

1
R.Alonso

このコードはモジュールで使用できます

Public Sub SendKeyTab(CForm As Form)
On Error Resume Next
Dim G As Single
For G = 0 To CForm .Controls.Count - 1
    If CForm .Controls(G).TabIndex = CForm .ActiveControl.TabIndex + 1 Then CForm .Controls(G).SetFocus
Next
End Sub

各フォームレベルで

If KeyCode
1
Anand Karia

問題はvb6 IDEおよびWindowsデスクトップのコンテキストメニューに関するものであり、ここで説明するように実行します。

http://www.vbforums.com/showthread.php?747425-SendKeys-and-Windows-8

そして主なリファレンスはここにあります:

http://www.vbforums.com/showthread.php?745925-RESOLVED-How-to-trigger-the-desktop-context-men

1
misafer